2015-09-10 47 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標誌。

相關問題