我正在尝试在TASM中创建一个接受数组作为参数的proc。问题是,结果搞砸了。这是代码:
TextParameter equ [bp+8]
MenuColorParameter equ [bp+6]
RowToPrint equ [bp+4]
PrintBar proc
push bp
mov bp, sp
mov dh, RowToPrint
mov dl, 0
mov bh, 0
mov ah, 2
int 10h
mov si, 0
mov cx, 1
@@Print:
mov ah, 9
mov al, [TextParameter+si]
mov bl, [MenuColorParameter+si]
int 10h
mov ah, 2
inc dl
int 10h
inc si
cmp si, MENU_LEN ; const in DATASEG
jc @@Print
mov ah, 2
mov bh, 0
mov dl, 0
mov dh, 2
int 10h
pop bp
ret 6
PrintBar endp
当通过DATASEG引用数组时(如在mov,Array [si]中),proc按预期工作。
答案 0 :(得分:1)
我假设您通过地址(即它们的偏移量)传递数组,因为参数似乎是每个2个字节。如果是这样,您需要先将该地址加载到寄存器中,然后添加si
并从内存中执行另一次读取:
mov bx, TextParameter ; expands to mov bx,[bp+8]
mov al, [bx+si]
mov bx, MenuColorParameter ; expands to mov bx,[bp+6]
mov bl, [bx+si]
答案 1 :(得分:0)
除了Michael的回答,我发现了问题 - int 10h ah = 9和int 10h ah = 2期望bh作为视频页码。在分配al和bl之后,我需要mov bh, 0
。 @@ Print标签现在是:
@@Print:
mov ah, 9
mov bx, TextParameter
mov al, [bx+si]
mov bx, MenuColorParameter
mov bl, [bx+si]
mov bh, 0
int 10h
mov ah, 2
inc dl
int 10h
inc si
cmp si, MENU_LEN ; const in DATASEG
jc @@Print