2016-04-14 43 views
0

我目前的代碼工作,並且是如下問題與推動直接變量疊加

push ebp   
mov ebp, esp  

mov ecx, [ebp + 8] 
mov eax, [ebp + 12] 

push edi   
push ecx   

not byte ptr[eax] 

//... 

不過,我希望直接推VAR2的地址,隨着簡單地推動var1的價值如此,但我無法弄清楚如何:

push var1    
push var2 //address of) 

call func1 

任何和所有幫助w將不勝感激。

回答

1

無法獲取寄存器值的地址。

然而,有兩件事情可以做:

如果該值是在僞寄存器var2並通過程序的操作(即,不是一個系統調用返回寄存器產生,等等),你可以簡單地做以下代替mov var2, [avar2]

mov var2, avar2 

如果不適合你,你可以把var2堆棧和esp獲取地址,例如

push var2 
lea avar2, [esp-4] 
2

那麼,如果字節變量var1在內存中有一個DWORD空間(4字節)並且是零擴展,那麼你可以只用PUSH它。如果var2的地址位於.data分段中的恆定地址處,則可以替換LEAvar2'。像這樣:

push var1 
push offset var2    
call func1 

在這些條件下,您的要求很容易滿足。

+0

在'80186'和之後'PUSH'可以立即操作。 –

+0

謝謝。然而,var1是一個char,那麼對於上面的變化會有什麼變化?另外,我不確定'offset'是什麼意思,因爲這是一個無效操作數。 – Akrilla

0

用編譯器EMU8086你可以做到。接下來是一些改變你的代碼(我使用的是16個寄存器,這就是爲什麼BP + 4和BP + 6):

.stack 100h 
.data 
var1 dw 25    ;VAR1 = 25. 
var2 dw 800    ;VAR2 = 800. 
.code 
    mov ax, @data 
    mov ds, ax 

    push var1    ;PUSH 25. 
    push offset var2  ;PUSH ADDRESS OF 800. 
    call func1 

    mov ax, 4c00h 
    int 21h    ;FINISH. 

func1 proc 
    push bp 
    mov bp, sp 
    mov si, [ bp + 4 ] ;POP ADDRESS OF 800. 
    mov ax, [ bp + 6 ] ;POP 25. 

    not [ byte ptr si ] ;CX CANNOT BE USED AS POINTER. 

    pop bp 
    ret 
func1 endp 

800的地址被提取到SI代替CX因爲CX無法使用指向地址。

請記住,堆棧中的東西是顛倒存儲的:首先推送25,然後地址800,這就是爲什麼地址在位置BP + 4和位於BP + 6的位置25。