按地址将参数传递给Assembly 8086 MASM中的宏

时间:2014-06-06 15:23:48

标签: assembly macros parameters x86-16

我有一个宏来使用Interrupt Int 21,A来读取用户输入。 我想通过参数传递变量'parcela1'的地址,这样我就可以在宏内修改它。 打印parcela1(在程序结束时)打印2行随机字符和00000000,其中应该是输入的字符。 我不确定有什么问题,你能帮帮我吗?

.8086
.model small
.stack 2048

dseg segment para public 'data'
    parcela1    db '00000000$'      ;Var to pass by address.
    InputBuffer db 9,0,8 dup(0),13
dseg ends

cseg segment para public 'code'
assume cs:cseg, ds:dseg

ReadInput MACRO UserInput, maxchar, minchar, x,y

    LOCAL READ_DATA,COPY_DATA

    pushf
    push ax 
    push bx
    push cx
    push dx
    push si

    mov ah,02h              ;position cursor at x,y.
    mov bh,0
    mov dl,x
    mov dh,y
    int 10h

    mov al,maxchar          ;Max number of chars to read.
    add al,1                ;maxchar + 1 (1 for CR).
    mov inputBuffer[0],al
    mov bl,minchar

    mov ah,0Ah              ;INT 21,A - Buffered Keyboard Input.

READ_DATA:
    lea dx,InputBuffer
    int 21h
    cmp InputBuffer[1],bl   ;If chars read < minchar repeat.
    jb  READ_DATA

    xor bx,bx
    mov bl,InputBuffer[1]   ;store num chars read in BL.

    mov cx,bx               ;Loop CX.

    mov si,bx               ;SI - index of last char read in InputBuffer. 
    inc si

    xor bx,bx               ;DI - index of last position of UserInput.
    mov bl,maxchar
    dec bl

COPY_DATA:                  ;copy chars read to parcela1.
    mov al,InputBuffer[si]
    mov [UserInput+bx],al
    dec si
    dec bx
    loop COPY_DATA

    pop si
    pop dx
    pop cx
    pop bx 
    pop ax
    popf
ENDM

Main proc
    mov ax, dseg
    mov ds, ax

    lea si,parcela1         ;Pointer to start of vector.
    ReadInput si,8,1,0,0    ;macro ReadInput 

    lea dx,parcela1         ;print parcela1
    mov ah,09h
    int 21h

    mov ah,08h              ;pause.
    int 21h

ENDPROG:
    mov ah,4ch
    int 21h
Main endp
cseg ends
end Main

1 个答案:

答案 0 :(得分:0)

至少你忘记了

mov ax, dseg
mov ds, ax

在主程序的开头。 ASSUME还不够。

第二个错误适用于宏。

ReadInput si,8,1,0,0 ;macro ReadInput

汇编时替换的文本替换规则。您不能将计算值传递给宏。因此,当汇编程序达到

mov [UserInput+bx],al

将其替换为

mov [si+bx],al

由于SI已在宏内部发生变化,因此您将获得错误的指针,AL将存储在其他位置。如果你需要传递将在运行时计算的参数,你必须创建一个过程。

第三个错误是对InputBuffer的结构和使用的深刻误解。请阅读INT 21h/0Ah的引用,例如http://www.ctyme.com/intr/rb-2563.htm。还要考虑INT 21h/0Ah中缓冲区和INT 21h/09h中缓冲区的不同字符串结尾字符。