我正在尝试在linux上的nasm程序集中打印单个数字整数。我目前编写的内容很好,但没有任何内容写入屏幕。谁能向我解释我在这里做错了什么?
section .text
global _start
_start:
mov ecx, 1 ; stores 1 in rcx
add edx, ecx ; stores ecx in edx
add edx, 30h ; gets the ascii value in edx
mov ecx, edx ; ascii value is now in ecx
jmp write ; jumps to write
write:
mov eax, ecx ; moves ecx to eax for writing
mov eax, 4 ; sys call for write
mov ebx, 1 ; stdout
int 80h ; call kernel
mov eax,1 ; system exit
mov ebx,0 ; exit 0
int 80h ; call the kernel again
答案 0 :(得分:7)
这是添加,而不是存储:
add edx, ecx ; stores ecx in edx
将ecx复制到eax,然后用4:
覆盖它mov eax, ecx ; moves ecx to eax for writing
mov eax, 4 ; sys call for write
编辑:
对于'write'系统调用:
eax = 4
ebx = file descriptor (1 = screen)
ecx = address of string
edx = length of string
答案 1 :(得分:4)
在回顾了其他两个答案之后,这就是我最终想出来的。
sys_exit equ 1
sys_write equ 4
stdout equ 1
section .bss
outputBuffer resb 4
section .text
global _start
_start:
mov ecx, 1 ; Number 1
add ecx, 0x30 ; Add 30 hex for ascii
mov [outputBuffer], ecx ; Save number in buffer
mov ecx, outputBuffer ; Store address of outputBuffer in ecx
mov eax, sys_write ; sys_write
mov ebx, stdout ; to STDOUT
mov edx, 1 ; length = one byte
int 0x80 ; Call the kernel
mov eax, sys_exit ; system exit
mov ebx, 0 ; exit 0
int 0x80 ; call the kernel again
答案 2 :(得分:1)
从男人2写
ssize_t write(int fd, const void *buf, size_t count);
除了指出的其他错误之外,write()还会将指针作为数据和长度,而不是您尝试提供的寄存器中的实际字节本身。
因此,您必须将数据从寄存器存储到内存并使用该地址(或者如果它当前是常量,请不要将数据加载到寄存器中,而是加载其地址)。