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 中编译此文件,但程序给了我一个错误,我完全不知道问题出在哪里。它与我的操作系统有关吗?

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 回答
1

我知道这是一个旧线程,但我一直有这个问题并想澄清它。

您需要更改_start_main. 我相信这是这样 NASM 可以正确组装您的文件,将引用替换为WinMain@16_main以便 MinGW 可以成功链接它

另外,int 0x80是一个LINUX系统调用。也许call _printf改用,并放在extern _printf程序的顶部。

于 2017-05-28T18:20:08.003 回答
0

您的代码不应该使用标准 C 库,因此将其与 bareld而不是链接gcc会有所帮助(_start默认情况下是入口点,可以使用--entryfor 选项指定其他入口点ld)。

但这无济于事:此代码不适用于 Windows 操作系统,而且您显然是在为 Windows 编译它。

于 2013-01-31T05:38:45.890 回答