如何在汇编语言中使用变量使寄存器溢出

How to make a register overflow using variables in Assembly Language

我正在学习汇编语言 (x86),我需要弄清楚如何仅使用变量而不是中间值来使寄存器溢出。

我要溢出 AX 寄存器,方法是将 FFFF 放入一个变量,将该变量移入 AX,然后递增 AX。但是,我 运行 遇到了问题。首先,我要像这样声明一个 WORD 变量:

limitReg WORD 0

然后稍后在 .code 我这样做:

MOV limitReg, FFFFh
MOV ax, limitReg

但是,我收到以下错误:

Error   1   error MSB3721: The command "ml.exe /c /nologo /Zi     /Fo"Debug\pa2.obj" /Fl"PA2.lst" /I "C:\Irvine" /W3 /errorReport:prompt  /Ta..\..\..\..\..\..\..\Irvine\Examples\ch03\pa2.asm" exited with code 1. C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\BuildCustomizations\masm.targets 50

有人可以帮我学习这个吗?

"intermediate values"嗯?您是说 "immediate" 吗?内存位置是 中间值。直接使用它们 (inc [myvar]) 通常不是一个好主意。内存用于变量的长期存储,或者当您 运行 超出寄存器并需要溢出一个时。

除了术语,我想我知道你想做什么(出于某种原因使用 16 位 asm):

section .data
myvar: dw 0FFFFH     ; 2 bytes of storage intialized to -1

section .text
GLOBAL asmfunction
asmfunction:
    ;mov ax, myvar   ; ax = address of myvar
    mov ax, [myvar]  ; ax = contents of myvar
    inc ax
    mov [myvar], ax  ; store back to the global variable
    ret

实际上,在 MASM 语法中(而不是 NASM),mov ax, myvar 可能仍然是一个加载,而不是带有地址的立即移动。如果你想要 load/store,总是写成 [addr] 绝对是个好主意。如果要地址,you can use mov ax, offset myvar,效率比lea ax, [myvar]

此外,更简单地说:

xor ax, ax   ; zero ax (but not eax)
dec ax       ; unsigned carry from from 0 to 0xffff.
             ;  However, dec doesn't touch CF, only the other flags

谈论 "overflowing" 无符号值很常见,但请记住,指令根据 unsigned carry (between 0 and 0xff...) and signed overflow (between MIN_INT and MAX_INT).

设置 x86 进位和溢出标志