Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 2012 如何在汇编语言中使用变量使寄存器溢出_Visual Studio 2012_Assembly_X86_Overflow_Masm - Fatal编程技术网

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

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

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

通过将FFFF放入变量,将该变量移动到
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
)。请查看该文件的内容;它应该提供组装过程中出错的详细信息。@BoPersson
mov 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