私は、文字列を出力し、レジスタの値を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