简体   繁体   English

NASM Linux程序集打印整数

[英]NASM Linux Assembly Printing Integers

I am trying to print a single digit integer in nasm assembly on linux. 我试图在linux上的nasm程序集中打印单个数字整数。 What I currently have compiles fine, but nothing is being written to the screen. 我目前编写的内容很好,但没有任何内容写入屏幕。 Can anyone explain to me what I am doing wrong here? 任何人都可以向我解释我在这里做错了什么吗?

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 

This is adding, not storing: 这是添加,而不是存储:

add edx, ecx        ; stores ecx in edx

This copies ecx to eax and then overwrites it with 4: 这将ecx复制到eax,然后用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

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

From man 2 write 从男人2写

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. 除了已指出的其他错误之外,write()还会获取指向数据和长度的指针 ,而不是您尝试提供的寄存器中的实际字节本身。

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). 因此,您必须将数据从寄存器存储到存储器并使用该地址(或者如果它当前是常量,则不要将数据加载到寄存器中,而是加载其地址)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM