6
segment .data

msg db "Enter your ID", 0xA, 0xD
len equ $ - msg

segment .bss

id resb 10

segment .text

global _start

_start:

    mov eax, 4
    mov ebx, 1
    mov ecx, msg
    mov edx, len
    int 0x80

    mov eax, 3
    mov ebx, 0
    mov ecx, id
    mov edx, 10
    int 0x80

    mov eax, 4
    mov ebx, 1
    int 0x80

_exit:

    mov eax, 1;
    xor ebx, ebx
    int 0x80

    ;End

gccを使用してこのファイルをcでコンパイルしようとしていますが、プログラムでエラーが発生し、問題がどこにあるのかまったくわかりません。それは私のOSと関係がありますか?

4

4 に答える 4

3

このプログラムは 32 ビット Linux でのみ動作します。このプログラムにはまだ問題があります。

'_start' を 'main' に変更します。また、ecx と edx は、システム コール (int 0x80) の後に保持されない場合があります。

以下の例を試してください。

アセンブル & リンク:
nasm -felf hello.asm
gcc -o hello hello.o

segment .data

msg db "Enter your ID", 0xA
len equ $ - msg

segment .bss

id resb 10

segment .text

global main

main:

    mov eax, 4
    mov ebx, 1
    mov ecx, msg
    mov edx, len
    int 0x80

    mov eax, 3
    mov ebx, 0
    mov ecx, id
    mov edx, 10
    int 0x80

    mov edx, eax  ;; length of the string we just read in.
    mov eax, 4
    mov ebx, 1
    mov ecx, id
    int 0x80

_exit:

    mov eax, 1;
    xor ebx, ebx
    int 0x80

    ;End
于 2013-01-31T13:05:30.793 に答える
1

Windows の場合、C ライブラリを使用しても問題ない場合は、この例を試してください。

;;Assemble and link with
;nasm -fwin32 hello.asm
;gcc -o hello hello.obj

global _main 
extern _scanf 
extern _printf     

segment .data

    msg: db "Enter your ID", 0xA, 0xD, 0  ; note the null terminator.
    formatin: db "%s", 0                  ; for scanf.

segment .bss
    id resb 10

segment .text

_main:

   push msg
   call _printf
   add esp, 4 

   push id  ; address of number1 (second parameter)
   push formatin ; arguments are pushed right to left (first parameter)
   call _scanf
   add esp, 8 


   push id
   call _printf
   add esp,4              

   ret  
于 2013-01-31T13:28:59.447 に答える
0

コードは標準Cライブラリを使用することを想定していないため、ld代わりにベアとリンクするとgcc役立ちます(_startデフォルトではエントリポイントですが、他のコードは--entryオプションで指定できますld)。

しかし、それは役に立ちません。このコードはWindows OS用ではなく、明らかにWindows用にコンパイルしています。

于 2013-01-31T05:38:45.890 に答える