assembly x64 NASM汇编打印从函数[duplicate]返回的单个字符

wwodge7n  于 2023-08-06  发布在  其他
关注(0)|答案(1)|浏览(82)

此问题已在此处有答案

Writing a putchar in Assembly for x86_64 with 64 bit Linux?(1个答案)
26天前关闭。
我正在编写一个简单的NASM x64汇编程序,它将两个个位数(分别为45)相加并将其打印在屏幕上。但是,我想使用一个过程调用(函数)。所以我首先用C语言设计了程序。

#include <stdio.h>

int sum(int x, int y) {

        int result = x + y;
        return result;

}

int main(void) {

        int x = 4;
        int y = 5;

        int result = sum(x, y);

        printf("The sum is: %d\n", result);

        return 0;

}

字符串
我在NASM x64汇编程序中重写了程序,如下所示。程序的预期输出是The sum is: 9。然而,我只能看到结果,除了计算结果,只有The sum is:

; Nasm 2.15.05 (on Linux x64)

STDOUT  equ     0x01    ; for RDI (file descriptor)
WRITE   equ     0x01    ; for RAX (for syscall itself)

section .data
        message         db      "The sum is: "
        messageLength   equ     $ - message

section .text
        global _start

        _start:
                mov rax, WRITE
                mov rdi, STDOUT
                mov rsi, message
                mov rdx, messageLength
                syscall

                mov rdi, 0x4
                mov rsi, 0x5

                call _sum

                mov rcx, rax            ; The result of the _sum (stored in RAX register)
                mov rax, WRITE
                mov rdi, STDOUT
                mov rsi, rcx
                mov rdx, 0x01
                syscall

                ; exit
                mov rax, 0x3C
                mov rdi, 0x00
                syscall

        _sum:
                mov rax, rdi
                add rax, rsi
                add rax, '0'            ; To make it printable ASCII
                ret                     ; Result: 0x39 (A single character '9' in ASCII)


(My环境是Windows 11上的WSL Ubuntu 22.04,Intel i9- 13900 H CPU)

knightchaser@3rdfr13nds:~/assembly$ ./procedures_x64
The sum is: knightchaser@3rdfr13nds:~/assembly$


使用GDB(GNU Debugger),我检查了_sum的计算是否成功,因此0x39(ASCII字符中的9)存储在RAX寄存器中,并且程序没有显示任何显式错误,如segmentation fault
我使用以下命令来制作可执行程序。

nasm -f elf64 -o procedures_x64.o procedures_x64.asm
ld -o procedures_x64 procedures_x64.o


但我看不到结果。我的汇编代码中是否有错误的地方?提前感谢!

jqjz2hbq

jqjz2hbq1#

打印你的性格你做

mov rcx, rax            ; The result of the _sum (stored in RAX register)
;...
mov rsi, rcx

字符串
问题是rax中返回的值是一个字符,您将该字符 value 移动到rsi中。write系统调用期望rsi中的值是指向字符的 * 指针 *,而不是实际字符值本身。
您需要将字符存储在内存中,然后将指向该内存的指针传递给write函数。
如果你在C中写了一个 exact 的等价物,当你必须使用指向操作符&来打印返回的字符(或使用字符数组)时,这将是非常明显的。我强烈建议您使用正确的C程序,使用系统调用和正确的sum函数以及从int到字符串的转换,并将其用作汇编程序的蓝图。

相关问题