将数组作为参数传递给 TASM 中的 proc?
Pass array as parameter to proc in TASM?
我正在尝试在 TASM 中创建一个接受数组作为参数的过程。问题是,结果全乱了。这是代码:
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 al,Array[si] 中),过程按预期工作。
我假设您正在按地址(即它们的偏移量)传递数组,因为每个参数似乎都是 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]
除了 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
我正在尝试在 TASM 中创建一个接受数组作为参数的过程。问题是,结果全乱了。这是代码:
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 al,Array[si] 中),过程按预期工作。
我假设您正在按地址(即它们的偏移量)传递数组,因为每个参数似乎都是 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]
除了 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