如何在x86汇编中保护多个声明?

时间:2016-04-23 21:24:56

标签: assembly x86 nasm

我编写了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

2 个答案:

答案 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.asmmain.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" 文件中有代码并且可能会生成多个函数副本作为私有函数