我有一个宏来使用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
答案 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
中缓冲区的不同字符串结尾字符。