NASM Linux Assembly Printing Целые числа - PullRequest
6 голосов
/ 01 августа 2011

Я пытаюсь напечатать однозначное целое число в сборке 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 

Ответы [ 3 ]

7 голосов
/ 01 августа 2011

Это добавление, а не хранение:

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:

Для системного вызова «запись»:

eax = 4
ebx = file descriptor (1 = screen)
ecx = address of string
edx = length of string
4 голосов
/ 08 мая 2013

После рассмотрения двух других ответов я наконец-то придумал.

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
1 голос
/ 02 августа 2011

От man 2 write

ssize_t write(int fd, const void *buf, size_t count);

В дополнение к другим указанным ошибкам write () принимает указатель на данные и длину, а не на фактическуюсам байт в регистре, который вы пытаетесь предоставить.

Таким образом, вам придется сохранять данные из регистра в памяти и использовать этот адрес (или, если он постоянен, как сейчас, не загружать данные в регистр, а вместо этого загружать его адрес).

...