在nasm写入stdout

时间:2015-07-24 15:00:50

标签: assembly x86 nasm

在这段代码中,我设法用syscalls打印一个数组:

%include 'syscalls32.inc'
section .bss
section .data
    array dd 1,2,3,4,5
    arraylen equ ($ - array) / 4            ; array length * 4 = number of elements
section .text
    global _start:
_start:
    mov     esi, 0                      ; get pointer to array
    mov     edi, arraylen - 1               ; edi = number of array elements
.PrintArray:
    mov     edx, 1                          ; print 1 byte                 
    mov     ecx, [array + 4]                    ; get current array element
    add     ecx, 48                         ; add 48 to convet to ASCII
    push    ecx                             ; push to stack since we need an address of item to print
    mov     ecx, esp                        ; mov address of char to ecx
    mov     ebx, stdout
    mov     eax, sys_write
    int     80h                             ; now print it
    pop     ecx                             ; balance stack
    add     esi, 4                          ; get next element, 4 because it's an array of dwords
    dec     edi                             ; decrease loop counter
    jns     .PrintArray                     ; if edi ! -1 continue loop
.PrintLineFeed:
    sub     esp, 4
    mov     byte [esp], 10
    mov     edx, 1
    mov     ecx, esp
    mov     ebx, stdout
    mov     eax, sys_write
    int     80h
    add     esp, 4                          ; not needed since next call is exit, but learn good techniques.
exit:
    mov     ebx, 0
    mov     eax, sys_exit
    int 80H

我发现了这个grep技巧来制作syscalls32.inc

grep __NR /usr/include/asm/unistd_32.h | grep define | sed -e 's/\#/\%/' -e 's/__NR_/sys_/' > syscalls32.inc

我怎样才能做出像std.inc那样的事情,因为现在我的代码出现了这个错误:symbol stdout undefined

顺便说一句,如果我在.data部分中将stdout设置为0:stdout equ 0它可以正常工作。但我想知道包含文件是否存在或是否可以制作?

1 个答案:

答案 0 :(得分:3)

在大会的土地上,如果它不存在,你就成功了。

没有错: stdout equ 0

也不是: %define stdout 0

将其中一个添加到源的顶部,在任何部分之外或将其添加到包含文件。