概述
。我正在用x86匯編(NASM)撰寫一個程式,該程式基本上是從用戶那里得到一個紅利和除數,然后呼叫一個程序來進行除法,在EAX中回傳數值供我列印。我使用Paul Carter的asm_io.inc庫來實作C的I/O功能(http://pacman128.github.io/pcasm/)。以下是我在命令列中輸入的內容,以使程式運行。
nasm -f win32 source.asm gcc source.obj driver.c asm_io.obj.
問題所在
。現在的問題是,當我向存盤程序(稱為divide)傳遞兩個引數時,我試圖通過間接訪問引數(例如,[ebp 8]為第一個引數),然而它得到的是記憶體地址。我試著除錯它,但沒有用。是否有什么地方我做錯了,產生了錯誤的結果?我的代碼:
%include "asm_io.inc"
段.data
prompt1 db "輸入一個紅利。", 0
prompt2 db "輸入一個除數。", 0
answer1 db " 除以 " , 0
答案2 DB "等于", 0
段落.bss
紅利 resd 1
被除數 resd 1
段落.text
全域_asm_main
_asm_main:
輸入0,0
撥號
mov eax, prompt1
呼叫print_string
呼叫 read_int
mov [股息], eax
mov eax, prompt2
呼叫print_string
呼叫 read_int
mov [除數], eax
mov eax, [dividor], eax
呼叫print_int
mov eax, answer1
呼叫print_string
mov eax, [除數].
呼叫print_int
mov eax, answer2
呼叫print_string
push dword dividend
push dword divisor
呼叫除法
添加esp,8
呼叫 print_int
激活
mov eax, 0
離開
回傳
除法。
push ebp
mov ebp, esp
mov eax, [ebp 8].
除以 dword [ebp 4] 。
pop ebp
退回
uj5u.com熱心網友回復:
push dword dividend push dword divisor
在NASM中,這些指令將推送變數的地址。你需要使用方括號來獲得它們的實際值。
push dword [dividor]
推送 dword [除數]
你的divide例程忘記了在執行div指令之前將edx暫存器清零!
你的divide例程忘記了在執行div指令之前將edx暫存器清零!
你的divide例程目前將divisor除以回傳地址。
這就是正確的代碼:
divide:
divide:
push ebp
mov ebp, esp
mov eax, [ebp 12] ; Dividend
xor edx, edx
div dword [ebp 8] ; 除數
pop ebp
退回
當然,你可以選擇在子程式中傳遞地址和解除參考:
你可以選擇在子程式中傳遞地址和解除參考:
divide:
push ebp
mov ebp, esp
mov ecx, [ebp 8] ; 除數的地址
mov ecx, [ecx]
mov eax, [ebp 12] ; Dividend的地址
mov eax, [eax] ; 分紅的地址
xor edx, edx
除掉ecx
pop ebp
回傳
uj5u.com熱心網友回復:
通過push指令,你突然放棄了間接性,而要求它簡單地推送地址。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/320415.html
標籤:
