1

64 ビットの lubuntu で nasm にスタックを実装する際に問題が発生しています。他の ubuntu OS では正しく動作し、オンライン コンパイラで実行すると正しく動作します。私のOSがnasmのスタックをサポートしていないのか、それとも適用する必要があるコードがあるのか​​ 考えていました.

section .data   
    num dw 0
    x dw 5
    y dw 4
    newline db "",10
    newlineLen equ $-newline

section .bss

section .text
    global _start

_start:
    sub esp,2
        push word[x]
    push word[y]
    call sum
    pop word[num] ;fetch the sum from the stack

    ;convert num for printing
    add word[num],30h

    mov eax,4
    mov ebx,1
    mov ecx,num
    mov edx,1
    int 80h

    mov eax,4
    mov ebx,1
    mov ecx,newline
    mov edx,newlineLen
    int 80h

    mov eax,1
    mov ebx,0
    int 80h

sum:

    mov ebp,esp
    mov ax,[ebp+6] ;5
    add ax,[ebp+4] ;4+5
    mov [ebp+8],ax ;store the result in the space allocated for the sum
    ret 4 ;esp+4
4

2 に答える 2

0

なぜあなたはWORDsを使っていますか?古い 16 ビット プロセッサを使用している場合を除き、32 ビットのレジスタとパラメーターを使用する必要があります。あなたはアセンブリを学んでいますか?正しい方法を学んでください-ebp移動する前に保存espしてください!!!!! 「マジック」ナンバーを使用する習慣をやめ、代わりにパラメーターに定数を使用してください

なぜあなたsub esp, 2は最初に?不要です。正しい結果で修正されたコード:

%define sys_exit    1
%define sys_write   4
%define stdout      1

section .data   
num dd 0
x dd 5
y dd 4
newline db "",10
newlineLen equ $-newline

section .bss

section .text
    global _start

_start:
    push    dword[x]
    push    dword[y]
    call    sum
    mov     dword[num], eax 

    ;convert num for printing
    add     dword[num],30h

    mov     eax, sys_write
    mov     ebx, stdout
    mov     ecx, num
    mov     edx, 1
    int     80h

    mov     eax, sys_write
    mov     ebx, stdout
    mov     ecx, newline
    mov     edx, newlineLen
    int     80h

    mov     eax, sys_exit
    xor     ebx, ebx
    int     80h 

sum:
    push    ebp                             ; MUST save ebp!!!
    mov     ebp, esp

    mov     eax, [ebp+12] ;5
    add     eax, [ebp+8] ;4+5
    ;~ Standard way to return a value is in eax
    leave                                   ; same as pop ebp - mov esp, ebp
    ret 4 * 2 
于 2013-08-06T02:56:13.680 に答える