- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在 x86 汇编中,当对有符号整数进行 add
或 sub
操作溢出时设置溢出标志,当对无符号整数进行操作时设置进位标志整数溢出。
但是,当涉及到inc
和dec
指令时,情况似乎有些不同。根据这个website , inc
指令根本不影响进位标志。
但我找不到任何关于 inc
和 dec
如何影响溢出标志的信息,如果有的话。
发生整数溢出时,inc
或dec
是否设置溢出标志?对于有符号整数和无符号整数,这种行为是否相同?
=============================编辑 ========== ===================
好吧,基本上这里的共识是 INC 和 DEC 在设置标志方面应该与 ADD 和 SUB 表现相同,进位标志除外。 Intel手册上也是这么说的。
问题是,当涉及到无符号整数时,我实际上无法在实践中重现这种行为。
考虑以下汇编代码(使用 GCC 内联汇编更容易打印出结果。)
int8_t ovf = 0;
__asm__
(
"movb $-128, %%bh;"
"decb %%bh;"
"seto %b0;"
: "=g"(ovf)
:
: "%bh"
);
printf("Overflow flag: %d\n", ovf);
这里我们递减一个带符号的 8 位值 -128。由于 -128 是最小的可能值,溢出是不可避免的。正如预期的那样,打印出:Overflow flag: 1
但是当我们对一个unsigned 值做同样的事情时,行为并不像我预期的那样:
int8_t ovf = 0;
__asm__
(
"movb $255, %%bh;"
"incb %%bh;"
"seto %b0;"
: "=g"(ovf)
:
: "%bh"
);
printf("Overflow flag: %d\n", ovf);
这里我增加了一个无符号的 8 位值 255。由于 255 是最大的可能值,溢出是不可避免的。但是,这会打印出:Overflow flag: 0
。
嗯?为什么在这种情况下不设置溢出标志?
最佳答案
当操作会导致符号改变时设置溢出标志。您的代码非常接近。我能够使用以下 (VC++) 代码设置 OF 标志:
char ovf = 0;
_asm {
mov bh, 127
inc bh
seto ovf
}
cout << "ovf: " << int(ovf) << endl;
当 BH 递增时,MSB 从 0 变为 1,导致设置 OF。
这也设置了 OF:
char ovf = 0;
_asm {
mov bh, 128
dec bh
seto ovf
}
cout << "ovf: " << int(ovf) << endl;
请记住,处理器不区分有符号数和无符号数。当您使用 2 的补码运算时,您可以使用一组指令来处理这两种运算。如果要测试无符号溢出,则需要使用进位标志。由于 INC/DEC 不影响进位标志,因此您需要在这种情况下使用 ADD/SUB。
关于c - x86 程序集 : INC and DEC instruction and overflow flag,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3925528/
我刚刚找到了一个我们正在使用的脚本,它有一个子程序,里面写着 my %INC,它存储了一些关于激励的值,因此 %INC。这似乎从来都不是问题,或者从来没有人注意到。对我来说,它产生了 20 屏的重新定
我遇到以下问题。 Can't locate File/Remote.pm in @INC (@INC contains: /pkg/qct/software/perl/q4_06/.lib/site_
我有以下 NASM 汇编程序,运行时间约为 9.5 秒: section .text global _start _start: mov eax, 0 mov ebx, 8 loop:
如何检测字符串是article/page/inc/3/4在/的最后第三个索引中有inc? 并获取上面示例中 / 的最后第二个索引是 3? 我有两个不同的字符串,1:'article/page/4',2
我正在使用 Centos 6 并安装 Perl-CPAN 和开发工具。我似乎无法安装 Test:Harness::Straps 它会出现此错误: Can't locate Module/Build.p
当我尝试使用 $inc 在 mongodb 中按指定值增加字段时,出现以下错误 “未处理的拒绝 MongoError:‘$inc’中的美元 ($) 前缀字段‘$inc’对于存储无效。” 下面是我的代码
我使用 dompdf 通过 php 将 html 页面保存为 pdf。我在我的 html 页面(实际上是 php 页面)中使用波斯字符,但是当我尝试将其保存为 pdf 时,导出的内容看起来像“????
我有 window 。我想使用库tensorflow创建一个C++ op。通过https://www.tensorflow.org/guide/extend/op#compile_the_op_usi
我正在尝试通过 svn2git 将 svn 存储库导入到 git 中。当我运行 svn2git --verbose https://url_to_repo 时,我最终得到以下输出: Running c
我尝试将一些模块安装到新服务器 (fedora core 18),但出现此错误: Can't locate CPAN.pm in @INC (@INC contains: /usr/local/lib
这个问题在这里已经有了答案: What's the easiest way to install a missing Perl module? (24 个答案) 关闭 7 年前。 我有 Solari
这个问题在这里已经有了答案: What's the easiest way to install a missing Perl module? (24 个答案) 关闭 7 年前。 我有 Solari
我遇到了很多麻烦,我想安装 Mojo::DOM,但我在互联网上找不到安装它的指南。 最佳答案 apt install libmojolicious-perl 或者 cpan install Mojo:
如果我了解模块最终出现在@INC 下的各个目录中的原因,这将有助于我了解我拥有的模块 在 Windows 上的 ActiveState 下相当清楚 C:/Perl/lib C:/Perl/site/l
我想获取包含模块的完整文件名。考虑这段代码: package MyTest; my $path = join '/', split /::/, __PACKAGE__; $path .= ".pm";
所以我一直在尝试让 Electron 与 Perl6 一起工作,看起来在我努力破解东西以让它们工作之后,它只是不想这样做。我使用了以下脚本(来自 git 上 Electron 仓库的示例之一): #!
我有一堆脚本,我需要按顺序运行它们,如下所示 foreach my (qw (script1.pl script2.pl script3.pl ){ my $script=File::Spec->c
背景:我有一个 perl 模块——我们称它为 Foo::Common,它已安装在我们的一个文件服务器上(为了简单起见,我将其称为“全局” ' 版本)。该模块包含在每 15 分钟启动一次的大约 1000
我正在将一些网站从旧网络服务器迁移到新网络服务器。旧的网络服务器使用 Perl 5.8,新的网络服务器使用 Perl 5.28。两者之间的区别之一是在 5.8 上,脚本运行的目录默认包含在 @INC
我有一堆脚本需要按顺序运行它们,如下所示 foreach my (qw (script1.pl script2.pl script3.pl ){ my $script=File::Spec->cat
我是一名优秀的程序员,十分优秀!