3

先生がインクルードしたメインファイルに、自分で書いたサブルーチンを付けるプロジェクトをやっています。彼は私たちのサブルーチンをグローバルにするための指示をくれましたが、どうやら私はばかです。2 つの asm ファイルは同じフォルダーにあり、main.asm を使用nasm -f elf -g prt_dec.asmして同じことを行っています。ld prt_decmain.asm 内の関連コードは次のとおりです。

    SECTION .text                   ; Code section.
global  _start                  ; let loader see entry point
extern  prt_dec

_start:
mov     ebx, 17
mov     edx, 214123
mov     edi, 2223187809
mov     ebp, 1555544444


mov     eax, dword 0x0
call    prt_dec
call    prt_lf

使用すると、行call prt_decは「prt_decへの未定義の参照」をスローしますld main.o

私の prt_dec.asm のコード セグメントは次のとおりです。

    Section .text
    global prt_dec
    global _start

start:
prt_dec:
      (pushing some stuff)
L1_top:
(code continues)
4

1 に答える 1

4

別のasmファイルまたはオブジェクトファイルでルーチンを呼び出したいですか?prt_dec.asmをアセンブルしていて、メインプログラムで使用する複数のasmファイルをリンクしている場合は、サンプルの2つのasmファイルをアセンブルしてリンクしています... *注** 開始ラベルはありhello.asm ません!

メインasmファイル:hellothere.asm

sys_exit    equ 1

extern Hello 
global _start 

section .text
_start:
    call    Hello

    mov     eax, sys_exit
    xor     ebx, ebx
    int     80H

2番目のasmファイル:hello.asm

sys_write   equ 4
stdout      equ 1

global Hello

section .data
szHello     db  "Hello", 10
Hello_Len   equ ($ - szHello)

section .text
Hello:
        mov     edx, Hello_Len
        mov     ecx, szHello
        mov     eax, sys_write
        mov     ebx, stdout
        int     80H   
    ret

makefile:

APP = hellothere

$(APP): $(APP).o hello.o
    ld -o $(APP) $(APP).o hello.o

$(APP).o: $(APP).asm 
    nasm -f elf $(APP).asm 

hello.o: hello.asm
    nasm -f elf hello.asm

これで、コードを複数のasmファイルに分割したい場合は、それらをメインソースに含めることができます%include "asmfile.asm"。メインソースファイルの先頭に、メインファイルをアセンブルしてリンクするだけです。

于 2013-03-01T04:42:48.500 に答える