首页 > 解决方案 > 在 MacOSX 上的 x86 程序集 GNU 中处理寄存器整数值环绕

问题描述

我正在使用 MacOSX 上的 x86 GNU GAS 中的一个简单示例,其中将整数值300移动到eax寄存器中。正如预期300 mod 256的那样,只有(值44)实际存储在 中%eax,如echo$?Mac 终端所示:

.globl _main
_main:
   pushq %rbp
   movq %rsp, %rbp
   subq $16, %rsp
   movl $300, %eax;
   leave
   ret

但是,我的印象是有一个溢出/环绕标志来表示发生了环绕或者一个寄存器存储了 和 的整数除法的300结果256,结果是1。对于 x86 GNU,我找不到任何详细说明此过程(如果存在)的信息。有谁知道如何访问环绕值或溢出标志?

标签: macosassemblyx86gnugnu-assembler

解决方案


你的问题有几个误解。

首先,eax 可以保存从 0 到 4294967295 的值,mov $300, %eax实际上将 300 存储到 eax 中也是如此。

其次,mov指令不能溢出或回绕;源的大小和目标的大小是相同的。溢出标志用于算术运算。

打印 44的原因echo $?是操作系统向 shell 报告了进程退出状态的低字节。


推荐阅读