Linux程序集未打印到标准屏幕

Linux程序集未打印到标准屏幕,linux,assembly,x86,system-calls,Linux,Assembly,X86,System Calls,对于我的生活,我不明白为什么这不会打印到屏幕上。没有崩溃或分段故障,只是退出。是的,我是新来的。事实上,我正在找一位家庭教师。如果有人能帮忙的话,我将不胜感激 ; 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: ;

对于我的生活,我不明白为什么这不会打印到屏幕上。没有崩溃或分段故障,只是退出。是的,我是新来的。事实上,我正在找一位家庭教师。如果有人能帮忙的话,我将不胜感激

; 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

再次感谢您的帮助,如果有人在找学生,我愿意做志愿者。

基本上int 0x80已被弃用,请改用syscenter

举一个你想做的例子。。。虽然使用稍微不同的汇编语法编写

这是很久以前的事了


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

您仍然可以使用int 0x80,您的问题是使用错误。 您不会将参数推送到堆栈上,而是将参数传递到寄存器中。这些链接将显示什么调用使用什么寄存器:

这里的内容看起来几乎像BSD代码——BSD在堆栈上推送参数并使用int 80h。Linux系统调用采用寄存器、ebx、ecx、edx(这就是您所需要的)、esi、edi。。。甚至可能是ebp。您不需要重新整理或清理堆栈

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()
(有些人认为这是更好的)

你必须把它链接得稍微不同一点。你的想法是对的。。。事实上,你有两个正确的想法,你只是把它们混在一起了!:)


不要试图从
\u start
标签中
ret
——它没有被调用,而是跳转到

您没有正确使用write。好了,它根本不使用堆栈检查这个谢谢大家的回答。你给了我大量的信息和阅读链接,这些已经证明是非常有用的。例如,我不知道寄存器必须按特定顺序填充。Narue编写了一个很好的入门教程,但是它处理了所有被推送到堆栈中的参数,并使用了像_printf这样的东西,它只在cygwin中工作,在linux上不工作。在这一点上,感谢纳鲁让我感兴趣,感谢所有回应让我上瘾的人。
; 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