2013-03-01 20 views
1

我正在做一個項目,附加了一個子程序,我寫了一個包含在老師的主文件中的子程序。他給我們提供了使我們的子程序全球化的指示,但顯然我是個白癡。這兩個asm文件位於同一個文件夾中,我使用nasm -f elf -g prt_dec.asmld prt_dec,然後對main.asm執行相同的操作。下面是在main.asm中的相關代碼:nasm從另一個文件調用子例程

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) 

回答

2

你想在另一個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 

二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 

生成文件:

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"你的主要源文件,只是彙編和鏈接你的主文件。

+0

謝謝,它看起來像問題是我組裝文件的方法。 – rcj 2013-03-01 21:16:10

相關問題