如何在汇编语言中使用变量使寄存器溢出
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 进位和溢出标志
我正在学习汇编语言 (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
).