我编写了x86汇编代码,用于打印字符串并以十六进制格式打印寄存器的值。我创建了两个单独的asm文件,print_string.asm
用于打印字符串,print_hex.asm
用于打印十六进制值。我已将这些文件包含在main.asm
文件中。现在问题是print_hex.asm
还包括用于打印字符串的print_string.asm
。所以汇编程序显示symbol redefined
错误!我怎么解决这个问题?我使用 NASM 作为汇编程序。
这是我的汇编代码:
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
答案 0 :(得分:2)
我猜你在使用NASM?如果是这样,您可以采用与C头文件中使用的完全相同的方法,并将包含的asm文件包装在%ifndef
- %endif
块中。
%ifndef PRINT_STRING_ASM
%define PRINT_STRING_ASM
; body of print_string.asm
%endif
如果文件包含多次,则第二次定义PRINT_STRING_ASM
宏,并跳过该文件的内容。
答案 1 :(得分:2)
对于您的main.asm
,只需从%include "printstring.asm"
移除printhex.asm
,main.asm
已包含%include
。
对于更通用的解决方案,删除所有%ifndef/%define/%endif
语句,使每个函数成为global / extern并单独组装它们。然后,将它们链接在一起。
虽然可以使用.h
锁[类似于C中用于.asm
文件的内容],但不建议这样做,因为您在# electric_cars.py
from cars import ElectricCar
class Tesla(ElectricCar):
name = "Tesla"
class Faraday(ElectricCar):
name = "Faraday"
class Zoe(ElectricCar):
name = "Zoe"
文件中有代码并且可能会生成多个函数副本作为私有函数