Visual studio 2012 如何在汇编语言中使用变量使寄存器溢出
我正在学习汇编语言(x86),我需要弄清楚如何只使用变量而不是中间值使寄存器溢出 通过将FFFF放入变量,将该变量移动到Visual studio 2012 如何在汇编语言中使用变量使寄存器溢出,visual-studio-2012,assembly,x86,overflow,masm,Visual Studio 2012,Assembly,X86,Overflow,Masm,我正在学习汇编语言(x86),我需要弄清楚如何只使用变量而不是中间值使寄存器溢出 通过将FFFF放入变量,将该变量移动到AX,然后递增AX,我可以使AX寄存器溢出。然而,我遇到了问题。首先,我要声明一个WORD变量,如下所示: limitReg WORD 0 然后在以后的.code中,我执行以下操作: MOV limitReg, FFFFh MOV ax, limitReg 但是,我得到以下错误: Error 1 error MSB3721: The command "ml.exe
AX
,然后递增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
有人能帮我学一下吗 “中间值”啊?你是说“立即”吗?内存位置是中间值。直接使用它们(inc[myvar]
)通常不是一个好主意。内存用于长期存储变量,或者当寄存器用完需要溢出时
撇开术语不谈,我想我知道您想做什么(出于某种原因使用16位asm):
实际上,在MASM语法(而不是NASM)中,movax、myvar
可能仍然是一个加载,而不是带有地址的mov立即数。如果您想要加载/存储,最好总是以[addr]
的形式编写。如果您想要比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
谈论“溢出”无符号值是很常见的,但请记住,指令根据设置x86进位和溢出标志。控制台中没有更多错误消息吗?有些代码指向无法汇编的实际代码行。@Michael Nope。在masm中,您可以从内存加载,比如
mov ax,[limitReg]
,它从地址加载,而不仅仅是加载地址本身。而且,你的第一条指令根本不存在。您不能在不涉及寄存器的情况下移动值。汇编程序应该生成一个文件PA2.lst
(考虑到命令行选项/F1
)。请查看该文件的内容;它应该提供组装过程中出错的详细信息。@BoPerssonmov ax,[limitReg]
是NASM语法(或理想模式下的TASM);MASM不接受括号。而MOV内存,immediate
自最初的8086以来一直是有效的指令。如果我错了,请纠正我。
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