2016-04-23 12 views
3

私は、文字列を出力し、レジスタの値を16進形式で表示するためのx86アセンブリコードを書いています。文字列を印刷するためのprint_string.asmと、16進値を出力するためのprint_hex.asmという2つの別々のasmファイルを作成しました。私はそれらのファイルを私のmain.asmファイルに含めました。今問題はprint_hex.asmにも文字列を印刷するためのprint_string.asmが含まれています。したがって、アセンブラはsymbol redefinedエラーを表示しています!どうすればこの問題を解決できますか?私はNASMをアセンブラとして使用しています。ここでx86アセンブリで複数の宣言を守るには?

は私のアセンブリコードです:

明main.asm

mov ax, 0x7c0 
mov ds, ax 
mov bx, STRING 
call PRINT_STRING 

mov dx, 0x4f3e 
call PRINT_HEX 

jmp $ 

%include "printstring.asm" 
%include "printhex.asm" 

STRING: 
    db 'Hello World', 0 

times 510-($-$$) db 0 
dw 0xaa55 

print_string.asm

PRINT_STRING: 
    pusha 
    mov ah, 0x0e 

    PLOOP: 
     cmp byte [bx], 0 
     je POUT 
     mov al, [bx] 
     int 0x10 
     add bx, 1 
     jmp PLOOP 

    POUT: 
     popa 
     ret 

printhex.asm

; This routine will print value of dx register 
; into hex 

; Hex Template Manipulation 
mov bx, HEX_TEMP 
add bx, 5 

HLOOP: 
    cmp byte [bx], 'x' 
    je HOUT 
    mov ax, 0x000f 
    and ax, dx 
    cmp ax, 0x09 
    jg HCHAR 
    add ax, 0x30 

HCOMM: 
    mov byte [bx], al 
    shr dx, 4 
    sub bx, 1 
    jmp HLOOP 

HCHAR: 
    sub ax, 0x0a 
    add ax, 0x61 
    jmp HCOMM 

HOUT: 

mov bx, HEX_TEMP 
call PRINT_STRING 

%include "printstring.asm" 

HEX_TEMP: 
    db '0x0000', 0 

私はその上映次のエラーをコンパイルしよう:

printstring.asm:1: error: symbol `PRINT_STRING' redefined 
printstring.asm:5: error: symbol `PLOOP' redefined 
printstring.asm:13: error: symbol `POUT' redefined 

答えて

2

私はあなたがNASMを使用していることを推測していますか?もしそうなら、あなたはCヘッダーファイルで使用するのとまったく同じ方法を取って、付属のasmファイルを%ifndef - %endifブロックで囲むことができます。

%ifndef PRINT_STRING_ASM 
    %define PRINT_STRING_ASM 
    ; body of print_string.asm 
%endif 

ファイルは、次にPRINT_STRING_ASMマクロを介して第2の時間が定義されているであろうと、ファイルの内容はスキップされ回以上含まれている場合。

2

main.asmの場合はprinthex.asmから%include "printstring.asm"を削除してください。それはすでにmain.asmに含まれています。

もっと一般的な解決策として、%includeステートメントをすべて削除し、各機能をグローバル/エクスターナルにして個別にアセンブルします。次に、これらをリンクします。

[.hファイル用にCで使用されているものと同様] %ifndef/%define/%endifロックを使用することができますが、それはあなたが.asmファイル内のコードを持っているので、お勧めできませんし、プライベート関数

としての機能の複数のコピーを生成することがあります
関連する問題