2015-09-10 50 views
0

我正在学习汇编语言(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 

有人可以帮我解决这个问题吗?

+0

控制台中是否还有其他错误消息?有些指向无法组装的实际代码行。 – Michael

+0

@Michael Nope。我得到的唯一信息就是所陈述的。 – jshapy8

+0

在masm中,您从内存中加载了像'mov ax,[limitReg]',它从**地址加载**,而不是只加载地址本身。另外,你的第一条指令不存在。如果不涉及注册表,您无法移动值。 –

回答

2

“中间值”是吧?你的意思是“直接”吗?内存位置是,都是的中间值。直接使用它们(inc [myvar])通常不是一个好主意。内存用于长期存储变量,或者当您用完寄存器并需要溢出时。

术语之外,我想我知道你在想什么(使用16位汇编出于某种原因)做:

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仍然可能是一个加载,而不是地址的mov-immediate。如果你想要一个加载/存储,总是把它写为[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 

这是很常见谈“溢出”无符号值,但请记住,指令集基于unsigned carry (between 0 and 0xff...) and signed overflow (between MIN_INT and MAX_INT)的x86 Carry和Overflow标志。

相关问题