簡體   English   中英

鏈接的程序集子例程無法正常工作

[英]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, eaxcmp eax, 0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM