2014-04-24 52 views
0

下面的代碼:有人可以解釋我需要在這個80x86彙編程序中改變什麼嗎?

.586 
.MODEL FLAT 

INCLUDE io.h    ; header file for input/output 

.STACK 4096 

.DATA 
prompt1 BYTE "Enter n1", 0 
prompt2 BYTE "Enter n2", 0 
n1 dword ? 
n2 dword ? 
gcdp dword ? 
remp dword ? 

string BYTE 40 DUP (?) 
resultLbl BYTE "gcd is:",0 

.CODE 
_MainProc PROC 
     input prompt1, string, 40 
     atod string    
     mov n1, eax 

     input prompt1, string, 40 
     atod string    
     mov n2, eax 

     push n2 
     push n1 
     call gcd 
     add esp, 8 

     dtoa string, eax 
     output resultLbl, string 

     mov eax, 0 
     ret 
_MainProc ENDP 

gcd PROC 
     push ebp 
     mov ebp, esp 
     push n2 
     push n1 
     mov eax, n1 
     mov gcdp, eax 
     mov eax, n2 
     mov remp, eax 

    L1: mov eax, gcdp 
     cdq 
     idiv remp 
     mov ebx, remp 
     mov gcdp, ebx 
     mov remp, edx 
     cmp edx, 0 
     jnz L1 

     mov eax, gcdp 

     pop ebx 
     pop edx 
     pop ebp 
     ret 
gcd ENDP 

END 

而這裏的問題(由我的老師說): 「從堆棧讀取參數丟失,請確保您正在閱讀的N2和N1與字節PTR [EBP +8]和字節ptr [ebp + 12],你也不必在程序中推送n1,n2和pop n1n2,其餘的看起來不錯。

那麼...怎麼了?什麼需要改變,什麼是多餘的?

回答

0

什麼需要改變,什麼是多餘的?不需要

這些全局:

n1 dword ? 
n2 dword ? 
gcdp dword ? 
remp dword ? 

改用登記。讓我們也動string.data部分(初始化數據),進入.data?段(未初始化數據):

.DATA 
prompt1  BYTE "Enter n1", 0 
prompt2  BYTE "Enter n2", 0 
resultLbl BYTE "gcd is:",0 

.data? 
string  BYTE 40 DUP (?) 

.CODE 
_MainProc PROC 

    input prompt1, string, 40  
    atodw string    
    mov  esi, eax 

    input prompt1, string, 40  
    atod string    
    mov  edi, eax 

    push edi 
    push esi 
    call gcd 
    add  esp, 8 

    dtoa string, eax 
    output resultLbl, string 

    mov  eax, 0 
    ret 
_MainProc ENDP 

gcd PROC 
    push esi 
    push edi 
    push ebx 

    mov  esi, [esp + 16] ;n1 
    mov  edi, [esp + 20] ;n2 

L1: 
    mov  eax, esi 
    cdq 
    idiv edi 
    mov  ebx, edi 
    mov  esi, ebx 
    mov  edi, edx 
    cmp  edx, 0 
    jnz  L1 

    mov  eax, esi 

    pop  ebx 
    pop  edi 
    pop  esi 
    ret 
gcd ENDP 

END _MainProc 

我們「技術上」不必救esiedi,或ebxgcd PROC因爲沒有任何外部可以與我們的代碼進行交互,但讓我們學習正確的開始方式。如果我們不保存這些寄存器,那麼參數將在[esp + 4][esp + 8]。我們也可以得到一些進步,擺脫string全局變量,並使用堆棧來保存字符串。

相關問題