在TASM中将数组作为参数传递给proc?

时间:2015-08-30 11:05:54

标签: arrays tasm

我正在尝试在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按预期工作。

2 个答案:

答案 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