NASM Linux Assembly Printing Integers

前端 未结 3 1186
失恋的感觉
失恋的感觉 2021-02-04 18:41

I am trying to print a single digit integer in nasm assembly on linux. What I currently have compiles fine, but nothing is being written to the screen. Can anyone explain to me

相关标签:
3条回答
  • 2021-02-04 18:51

    From man 2 write

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

    In addition to the other errors that have been pointed out, write() takes a pointer to the data and a length, not an actual byte itself in a register as you are trying to provide.

    So you will have to store your data from a register to memory and use that address (or if it's constant as it currently is, don't load the data into a register but load its address instead).

    0 讨论(0)
  • 2021-02-04 19:07

    After reviewing the other two answers this is what I finally came up with.

    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
    
    0 讨论(0)
  • 2021-02-04 19:10

    This is adding, not storing:

    add edx, ecx        ; stores ecx in edx
    

    This copies ecx to eax and then overwrites it with 4:

    mov eax, ecx        ; moves ecx to eax for writing
    mov eax, 4          ; sys call for write
    

    EDIT:

    For a 'write' system call:

    eax = 4
    ebx = file descriptor (1 = screen)
    ecx = address of string
    edx = length of string
    
    0 讨论(0)
提交回复
热议问题