[英]Linked assembly subroutine doesn't work as expected
我正在用FASM編寫一個簡單的子例程,以將32位無符號整數打印到STDOUT。 這是我想出的:
format elf
public uprint
section ".text" executable
uprint:
push ebx
push ecx
push edx
push esi
mov ebx, 10
mov ecx, buf + 11
xor esi, esi
do:
dec ecx
xor edx, edx
div ebx
add dl, 0x30
mov [ecx], dl
inc esi
test eax, 0
jnz do
mov eax, 4
mov ebx, 1
mov edx, esi
int 0x80
pop esi
pop edx
pop ecx
pop ebx
ret
section ".data" writeable
buf rb 11
然后,我編寫了另一個程序來測試上面的子例程是否正常工作:
format elf
extrn uprint
public _start
section ".text" executable
_start:
mov eax, 1337
call uprint
mov eax, 4
mov ebx, 1
mov ecx, newline
mov edx, 1
int 0x80
mov eax, 1
xor ebx, ebx
int 0x80
section ".data"
newline db 0x0A
我將這兩個程序都編譯到它們相應的目標文件中,並將它們鏈接起來以創建可執行文件。
但是,在執行程序時,它僅顯示7
而不是1337
。 事實證明,無論數字本身如何,僅顯示數字的最后一位。
這很奇怪,因為我的
uprint
子例程正確。
實際上,如果我將這兩個程序組合到一個程序中,則它將正確顯示
1337
。
我究竟做錯了什么?
我收獲了鮮明的印象,你的鏈接操作正在建設的uprint
的前_start
和你其實進入UPRINT
,而不是在_start
如您所願。
我發現了我的錯誤。 我正在使用test eax, 0
始終設置零標志。 因此,僅處理第一個數字。 Intead我需要使用test eax, eax
或cmp eax, 0
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.