2

私の人生では、なぜこれが画面に印刷されないのか理解できません。クラッシュしたり、セグメンテーション違反が発生したりすることはなく、終了するだけです。はい、私は新しいです、そして実際のところ、誰かがそれを手伝ってくれるほど親切であることができれば、それは心から感謝されるでしょう。

; 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

繰り返しになりますが、どんな助けでも大歓迎です。誰かが学生を探しているなら、私はボランティアをする準備ができています。

4

3 に答える 3

1

あなたはまだint0x80を使うことができます、あなたの問題はそれを間違って使うことです。パラメータをスタックにプッシュするのではなく、パラメータがレジスタに渡されます。これらのリンクは、どのコールがどのレジスタを使用するかを示します 。Linuxシステムコールテーブル Linuxシステムコールリファレンス

于 2012-10-12T03:08:50.910 に答える
1

そこにあるものは、ほとんど 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

write()Cライブラリから呼び出すには(これが望ましいと主張する人もいます)...

; 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

少し違う方法でリンクする必要があります。あなたは正しいアイデアを持っています... 実際、あなたは 2 つの正しいアイデアを持っています。:)

ラベルretから取得しようとしないでください- 呼び出されるのではなく、ジャンプ先になります!_start

于 2012-10-12T03:36:06.270 に答える
0

基本的に、int 0x80は非推奨になりました。代わりに、SYSENTERを使用してください。

少し異なるアセンブリ構文で書かれていますが、あなたがやろうとしていることの正確な例を含む関連スレッド。

これはずっと前のことですhttp://articles.manugarg.com/systemcallinlinux2_6.html

sysenter...またはsysentervsint0x80のGoogleアラウンド。

于 2012-10-12T03:04:40.410 に答える