3

当我尝试在 Windows 上编译一个简单的汇编程序时,我遇到了奇怪的错误。这些错误看起来好像汇编器不知道我使用的函数是什么,并且出于某种原因也将 Haskell 带入其中。

这是我尝试编译时遇到的错误:

 C:\Users\Nick\Documents\COMP2210\>nasm -fwin32 first.asm

    C:\Users\Nick\Documents\COMP2210\>gcc first.obj -o first
    first.obj:first.asm:(.text+0xb): undefined reference to `print_string'
    first.obj:first.asm:(.text+0x10): undefined reference to `read_int'
    first.obj:first.asm:(.text+0x1f): undefined reference to `print_string'
    first.obj:first.asm:(.text+0x24): undefined reference to `read_int'
    first.obj:first.asm:(.text+0x3d): undefined reference to `sub_dump_regs'
    first.obj:first.asm:(.text+0x4b): undefined reference to `sub_dump_mem'
    first.obj:first.asm:(.text+0x55): undefined reference to `print_string'
    first.obj:first.asm:(.text+0x5f): undefined reference to `print_int'
    first.obj:first.asm:(.text+0x69): undefined reference to `print_string'
    first.obj:first.asm:(.text+0x73): undefined reference to `print_int'
    first.obj:first.asm:(.text+0x7d): undefined reference to `print_string'
    first.obj:first.asm:(.text+0x84): undefined reference to `print_int'
    first.obj:first.asm:(.text+0x89): undefined reference to `print_nl'
    C:/Program Files (x86)/Haskell Platform/2012.4.0.0/mingw/bin/../lib/libmingw32.a(main.o):main.c:(.text+0xd2): undefined reference to `WinMain@16'
    collect2: ld returned 1 exit status

    C:\Users\Nick\Documents\COMP2210\>

这是 NASM 代码:

;
; file: first.asm
; First assembly program. This program asks for two integers as
; input and prints out their sum.
;
; To create executable:
; Using djgpp:
; nasm -f coff -d COFF_TYPE first.asm
; gcc -o first first.o driver.c asm_io.o
;
; Using Borland C/C++
; nasm -f obj -d OBJ_TYPE first.asm
; bcc32 first.obj driver.c asm_io.obj

%include "asm_io.inc"
;
; initialized data is put in the .data segment
;
segment .data
;
; These labels refer to strings used for output
;
prompt1 db    "Enter a number: ", 0       ; don't forget nul terminator
prompt2 db    "Enter another number: ", 0
outmsg1 db    "You entered ", 0
outmsg2 db    " and ", 0
outmsg3 db    ", the sum of these is ", 0


;
; uninitialized data is put in the .bss segment
;
segment .bss
;
; These labels refer to double words used to store the inputs
;
input1  resd 1
input2  resd 1


;
; code is put in the .text segment
;
segment .text
        global  _asm_main
_asm_main:
        enter   0,0               ; setup routine
        pusha

        mov     eax, prompt1      ; print out prompt
        call    print_string

        call    read_int          ; read integer
        mov     [input1], eax     ; store into input1

        mov     eax, prompt2      ; print out prompt
        call    print_string

        call    read_int          ; read integer
        mov     [input2], eax     ; store into input2

        mov     eax, [input1]     ; eax = dword at input1
        add     eax, [input2]     ; eax += dword at input2
        mov     ebx, eax          ; ebx = eax
        dump_regs 1
        dump_mem 2, outmsg1, 1
;
; next print out result message as series of steps
;
        mov     eax, outmsg1
        call    print_string      ; print out first message
        mov     eax, [input1]     
        call    print_int         ; print out input1
        mov     eax, outmsg2
        call    print_string      ; print out second message
        mov     eax, [input2]
        call    print_int         ; print out input2
        mov     eax, outmsg3
        call    print_string      ; print out third message
        mov     eax, ebx
        call    print_int         ; print out sum (ebx)
        call    print_nl          ; print new-line

        popa
        mov     eax, 0            ; return back to C
        leave                     
        ret
4

2 回答 2

3

试试:gcc driver.c first.obj asm_io.obj -o first.exe。如果尚未完成,则必须创建asm_io.objfrom 。asm_io.asm

driver.c调用asm_mainglobal在您的代码中声明)。asm_io.inc声明这些函数extern(并提供宏来调用它们)。asm_io.obj包含功能。

Carter 博士的工作第一次开始工作有点棘手。它变得更容易。

于 2013-03-03T04:58:35.120 回答
0

您可能已经组装了 asm_io.inc 文件,然后在链接阶段包含了从中获得的目标代码。以下是这些错误的原因。asm_io.inc 文件不需要汇编,只需要包含它。需要组装的是 asm_io.asm 文件(位于https://raw.githubusercontent.com/humanshell/assembly/master/examples/ms/asm_io.asm)。您可以在文件本身上找到如何组装它。然后,一旦完成,您就可以进行所有目标文件的链接步骤。

于 2021-01-12T08:26:01.730 回答