此问题已在此处有答案:
Writing a putchar in Assembly for x86_64 with 64 bit Linux?(1个答案)
26天前关闭。
我正在编写一个简单的NASM x64汇编程序,它将两个个位数(分别为4
和5
)相加并将其打印在屏幕上。但是,我想使用一个过程调用(函数)。所以我首先用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
型
但我看不到结果。我的汇编代码中是否有错误的地方?提前感谢!
1条答案
按热度按时间jqjz2hbq1#
打印你的性格你做
字符串
问题是
rax
中返回的值是一个字符,您将该字符 value 移动到rsi
中。write
系统调用期望rsi
中的值是指向字符的 * 指针 *,而不是实际字符值本身。您需要将字符存储在内存中,然后将指向该内存的指针传递给
write
函数。如果你在C中写了一个 exact 的等价物,当你必须使用指向操作符
&
来打印返回的字符(或使用字符数组)时,这将是非常明显的。我强烈建议您使用正确的C程序,使用系统调用和正确的sum
函数以及从int
到字符串的转换,并将其用作汇编程序的蓝图。