将数组作为参数传递给 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