在 MacOSX 上的 x86 程序集 GNU 中处理寄存器整数值回绕
Handling Register Integer Value Wrap Around In x86 Assembly GNU on MacOSX
我正在 MacOSX 上使用 x86 GNU GAS 中的一个简单示例,其中 300
的整数值被移动到 eax
寄存器中。正如预期的那样,只有 300 mod 256
(值 44
)实际上存储在 %eax
中,正如 echo$?
从 Mac 终端显示的那样:
.globl _main
_main:
pushq %rbp
movq %rsp, %rbp
subq , %rsp
movl 0, %eax;
leave
ret
然而,我的印象是有一个 overflow/wrap-around 标志来表示发生了回绕或存储 300
和 256
整数除法结果的寄存器,结果为 1
。对于 x86 GNU,我一直无法找到任何详细说明此过程(如果存在)的信息。有谁知道如何访问环绕值或溢出标志?
你的问题有几个误解。
首先,eax 可以保存 0 到 4294967295 之间的值,因此 mov 0, %eax
实际上将 300 存储到 eax 中。
其次,mov指令不能溢出或回绕;源的大小和目标的大小相同。溢出标志用于算术运算。
之所以echo $?
打印44是操作系统将进程退出状态的低字节报告给shell.
我正在 MacOSX 上使用 x86 GNU GAS 中的一个简单示例,其中 300
的整数值被移动到 eax
寄存器中。正如预期的那样,只有 300 mod 256
(值 44
)实际上存储在 %eax
中,正如 echo$?
从 Mac 终端显示的那样:
.globl _main
_main:
pushq %rbp
movq %rsp, %rbp
subq , %rsp
movl 0, %eax;
leave
ret
然而,我的印象是有一个 overflow/wrap-around 标志来表示发生了回绕或存储 300
和 256
整数除法结果的寄存器,结果为 1
。对于 x86 GNU,我一直无法找到任何详细说明此过程(如果存在)的信息。有谁知道如何访问环绕值或溢出标志?
你的问题有几个误解。
首先,eax 可以保存 0 到 4294967295 之间的值,因此 mov 0, %eax
实际上将 300 存储到 eax 中。
其次,mov指令不能溢出或回绕;源的大小和目标的大小相同。溢出标志用于算术运算。
之所以echo $?
打印44是操作系统将进程退出状态的低字节报告给shell.