Цепочки печати NASM Linux
Я пытаюсь напечатать целое число с цифрой в сборке nasm на linux. То, что я в настоящее время компилирует, отлично, но ничего не записывается на экран. Может ли кто-нибудь объяснить мне, что я делаю неправильно здесь?
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
Ответы
Ответ 1
Это добавление, а не сохранение:
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
EDIT:
Для системного вызова 'write':
eax = 4
ebx = file descriptor (1 = screen)
ecx = address of string
edx = length of string
Ответ 2
После рассмотрения двух других ответов это то, что я наконец придумал.
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
Ответ 3
От человека 2 напишите
ssize_t write(int fd, const void *buf, size_t count);
В дополнение к другим указанным ошибкам write() принимает указатель на данные и длину, а не фактический байт в регистре, который вы пытаетесь предоставить.
Итак, вам нужно будет хранить свои данные из регистра в памяти и использовать этот адрес (или если он постоянный, как он есть сейчас, не загружайте данные в регистр, а загружайте его адрес).