Function x86程序集中的Sum函数-无输出

Function x86程序集中的Sum函数-无输出,function,assembly,x86,nasm,procedure,Function,Assembly,X86,Nasm,Procedure,我试图在x86汇编中编写一个简单的sum函数,我将3和8作为参数传递给它。但是,代码不会打印总和。感谢您对发现错误的帮助。我在用NASM section .text global _start _sum: push ebp mov ebp, esp push edi push esi ;prologue ends mov eax, [ebp+8] add eax, [ebp+12] pop esi

我试图在x86汇编中编写一个简单的
sum
函数,我将
3
8
作为参数传递给它。但是,代码不会打印总和。感谢您对发现错误的帮助。我在用NASM

section .text
global _start

_sum:
    push ebp
    mov ebp, esp
    push edi
    push esi           ;prologue ends
    mov eax, [ebp+8]
    add eax, [ebp+12]
    pop esi            ;epilogue begins
    pop edi
    mov esp, ebp
    pop ebp
    ret 8

_start:
    push 8
    push 3
    call _sum
    mov edx, 1
    mov ecx, eax
    mov ebx, 1      ;stdout
    mov eax, 4      ;write
    int 0x80
    mov ebx, 0
    mov eax, 1      ;exit
    int 0x80

对我来说,这看起来像Linux汇编程序。在第页的示例部分int 0x80小节中,ecx似乎期望字符串的地址:

_start:
    movl $4, %eax   ; use the write syscall
    movl $1, %ebx   ; write to stdout
    movl $msg, %ecx ; use string "Hello World"
    movl $12, %edx  ; write 12 characters
    int $0x80       ; make syscall
因此,您必须获得一个备用内存块,将结果转换为字符串,可能以null终止该字符串,然后使用ecx中字符串的地址调用write

有关如何将整数转换为字符串的示例,请参见,您必须将每个数字存储在字符串中,而不是打印它,并使用null终止它。然后可以打印字符串


很抱歉,我已经多年没有在assembly中编程了,因此我无法给您提供更详细的答案,但希望这足以为您指明正确的方向。

您会期待什么?stdout上的字符串“11”?我已经很久没有在汇编程序中编写任何东西了,但对我来说,您试图写入标准输出的是ASCII字符11(不是字符串“11”)或位于内存偏移量11(0xb)中的字符串。也许我错了,但这是我的猜测。顺便说一句,是Windows还是Linux?@XavierRubioJansana Linux。我尝试过添加eax,'0',以防它表示ascii 11,但没有用。不,您必须转换为字符串。我已更新了答案。谢谢您的帮助。我将该值转换为ascii,将其放入.bss中的内存位置,并将其地址作为第三个参数。非常适合打印1位数字。我想,对于两个或更多的数字,必须使用循环。