寫一個NASM宏:divide,有2個參數,它指定任何尋址模式中的無符號整數。宏計算第一個參數的上限,除以第二個參數,並將結果放入寄存器edx中。如果第二個參數是0(要在運行時測試),結果應該是0,並且應該將消息「除以零」輸出到stdout。NASM宏處理任何尋址模式
我怎麼知道哪個是哪個,所以我們可以處理每個案例? (;地址模式是:註冊,內存和直接的。)
編輯: 這是最後的代碼,我寫道: 如何編寫不帶標籤的代碼? (位置獨立代碼):
%macro divide 2
section .rodata
LC1: DB "divide by zero ", 10, 0
section .text
mov eax, %1
mov ebx, %2
cmp ebx, 0 ; divide by zero
jne rest1
push LC1
call printf
add esp,4
mov edx, 0
jmp end1
rest1:
mov edx, 0
div ebx
add eax, edx
mov edx , eax ; the result should be in edx
end1:
%endmacro
但eax可以是一個值,可以是一個地址。沒有? – user1462787
'EAX'是一個註冊表。它可以包含不同的值。一般來說,這些是否是地址取決於您。在宏中只有'MOV寄存器,參數'。當你調用這個宏時,這個參數可以是123,ECX,[EBX * 4 + EDI-3],無論你想要什麼。 –
查看已更新的答案。 –