Linux程序集不打印到stdout - 屏幕

时间:2012-10-12 02:49:27

标签: assembly

对于我的生活,我无法弄清楚为什么这不会打印到屏幕上。不会崩溃或出现故障,只是退出。是的,我是新人,事实上正在寻找导师,如果有人能够帮助他们,那将是非常感激的。

; Hello World in nasm
;

; Intel Linux bt 2.6.39.4 #1 SMP x86_64 GNU/Linux
; NASM version 2.07
; ld 2.20.1-system.20100303
;
; Compile to 32bit with debugging symbols:
; nasm -g -f elf32 -F dwarf string-w.asm
; ld -g -melf_i386 -o string-w string-w.o
; file string-w.asm

[section .data]
    msg db      "Hello World",0xa,0x0
    len equ     $ - msg

[section .bss]

[section .text]

   global _start

_start:

    push dword len
    push dword msg
    push dword 1    ; Stdout
    mov eax,0x4     ; write
    int 0x80
    ret
    add esp,12      

    push    dword 0
    mov     eax, 0x1     ; exit
    int     0x80

再一次,非常感谢任何帮助,如果有人在找学生,我愿意做志愿者。

3 个答案:

答案 0 :(得分:1)

你仍然可以使用int 80,你的问题是你使用它错了。 您不会将参数压入堆栈,而是将参数传递到寄存器中。这些链接将显示哪些调用使用什么寄存器: Linux System Call Table Linux System call Reference

答案 1 :(得分:0)

好吧,基本上int 0x80已弃用,请改用SYSENTER。

Related thread以及您正在尝试做的一个示例...虽然使用稍微不同的汇编语法编写。

很久以前http://articles.manugarg.com/systemcallinlinux2_6.html

谷歌周围的sysenter ...或sysenter vs int 0x80。

答案 2 :(得分:0)

你所拥有的东西看起来几乎像BSD代码 - BSD在堆栈上推送参数并使用int 80h。 Linux系统调用接受寄存器中的参数,ebx,ecx,edx(这就是你所需要的),esi,edi ......甚至可能是ebp。您不需要ret或清理堆栈。

mov edx, len
mov ecx, msg
mov ebx, 1 ; file descriptor for stdout
mov eax, 4 ; sys_write call number (for 32-bit)
int 80h

mov ebx, 0 ; exit code
mov eax, 1 ; sys_exit call number
int 80h

mov edx, len mov ecx, msg mov ebx, 1 ; file descriptor for stdout mov eax, 4 ; sys_write call number (for 32-bit) int 80h mov ebx, 0 ; exit code mov eax, 1 ; sys_exit call number int 80h

从C库中调用(有些人声称更可取)... write()

; nasm -f elf32 myprog.asm
; ld -o myprog myprog.o -I/lib/ld-linux.so.2 -lc -melf_i386
global _start
extern write

section .data
     msg db "Hello World", 10
     len equ $ - msg

section .text
_start:
    push len
    push msg
    push 1
    call write
    add esp, 4 * 3

    mov ebx, 0
    mov eax, 1
    int 80h

You'll have to link it a little differently. You've got the right idea... in fact you've got two right ideas, you've just got 'em mixed up! :)

标签 - 它未被调用,它被跳转到了!

最佳, 弗兰克