【问题标题】:Printing an array but specific values highlighted {emu8086}打印数组但突出显示特定值 {emu8086}
【发布时间】:2021-07-12 01:16:31
【问题描述】:

我想打印这个数组,但还要突出显示该数组中的特定字符。这是我的代码:

include 'emu8086.inc'
.data
animales1   db 'BUBRPQYFODFZXIQ'
            db 'MSVDJVQDTLOEATF'
            db 'RCZPIFYGAZLPMFN'
            db 'LVWKFFBKDXHFIUW'
            db 'AOSEFQEMOOTGQUR'
            db 'ELLWTGNJJKAJISJ'
            db 'OVCOXLUEQTSDDSP'
            db 'UEAEMTNYOLVYMGI'
            db 'ORREPOMJZGYPHAI'
            db 'IFTLCBJFVOYHLUB'
            db 'WTOWZQFRAXQRLMR'
            db 'KGNYIIHHHKFUKIJ'
            db 'XMLSACGMVXEYSIT'
            db 'TSOESQVSEQRFNPU'
            db 'ODDQMDFWRGETDLY'

lenguajes2  db 'SLKFMBCULKVYUIM'
            db 'TWCDQFYIVIKUXKB'
            db 'GNIWEQBOSYEMDTJ'
            db 'WDHFZZPUIEDERYQ'
            db 'KMTGTKAKROMUSUV'
            db 'BELBLLTUVJQHCRW'
            db 'UPLUBYJKNUXORLF'
            db 'SGMAOOEENBOGIWR'
            db 'JVSTLPTEGPPNPJW'
            db 'YINCASSEMBLYTTU'
            db 'CHWTIOIWORDZDRV'
            db 'BRZCNRAVRWAMUNU'
            db 'KOMCOUKNGQEPQVS'
            db 'XXRXJUJUBEXVGGA'
            db 'MNKJQKZAACVCLDW'
            
char db 'a'
flag db 0
;Pez= 12,27,42
;Ave= 76,92,108 
            
indx db 5,11,26,41,45 dup (' ')
.stack
.code
.start up
mov ax,0000h  
mov bx,0000h
mov cx,0000h
mov dx,0000h
lea si, animales1
;call valueInArray
call printArrays




printArrays proc


mov bx,0000h
printArray:
mov dx,0000h
mov ah, 02h
mov dl,byte ptr[si+bx]
call valueinArray
cmp flag,1
jz printSpecial
int 21h
mov dl, 20h
int 21h
add bx, 1
add cl, 1
cmp cl,15
jz nextRow
jnz printArray


nextRow:
call nwLine
add ch,1
mov cl, 00h
cmp ch,15
jz finproc
jnz printArray

printSpecial:


lea di,char
mov byte ptr[di],dl
push ax
push bx
push cx
push dx

mov bp, offset char
mov dh,00h
mov al, 1
mov bh, 0
mov bl, 1111_0000b
mov cx, 1; calculate message size. 
mov dx,0000h
mov ah, 13h
int 10h
mov dl, 20h
mov ah, 02h
int 21h
pop dx
pop cx
pop bx
pop ax
add bx, 1
add cl, 1
cmp cl,15
jz nextRow
jnz printArray

finproc:

ret
printArrays endp

nwLine PROC
MOV AH,02h
MOV DX,0Ah; imprime asscii 10 (nueva linea)
INT 21h
MOV DX,0Dh; imprime asscii 13 (retorno de carro)
INT 21h
RET
nwLine ENDP

valueInArray proc

mov flag, 0
mov di,0001h
iterar:
mov dh, indx[di]
cmp dh,20h
jz finvalueproc
cmp bl,dh
jz found
add di,1
jmp iterar
found:
mov flag,1
jmp finvalueproc:



finvalueproc:
ret
valueInArray endp 

exit:
end

如您所见,数组“indx”具有我想要突出显示的字符的位置(第一个数字是所述数组的有效长度),因此我检查 bx 是否在要打印的所述字符的位置它突出显示。 我现在有两个问题,第一个是突出显示的字符打印在一个随机的位置,这搞砸了其余的,但我想我知道为什么打印的突出显示字符的位置是错误的,因为中断我使用 dh 和 dl 作为定位器,但我不知道如何制作它,所以它继续其余的流程。第二个问题是打印的字符是错误的,如果你运行它并检查变量char,它有一个'Z',但它打印一个'T'。我真的需要帮助。请漂亮。 :(

【问题讨论】:

    标签: arrays assembly emu8086


    【解决方案1】:
    indx db 5,11,26,41,45 dup (' ')
    

    这条线可能不是你想的那样!
    阅读您的解释,我认为您的意思是:

    indx db 5, 11, 26, 41, 45, ' '
    

    即数组的长度为 5,然后是突出显示字符的 4 个偏移量和 1 个空格字符作为列表终止符。


    第一个是突出显示的字符在一个随机的位置打印,这弄乱了其余部分,但我想我知道为什么打印的突出显示字符的位置是错误的,因为我使用的中断使用 dh 和dl 作为定位器,但 我不知道如何制作它,所以它会继续其余部分的流程。

    因为您输出突出显示字符的代码使用了mov dx,0000h,所以 BIOS 函数 13h 将该字符放在屏幕的左上角,而其他“正常”字符将从那里继续。

    你所要做的就是使用函数 03h 询问 BIOS 光标在那个时刻的位置:

    替换

    mov cx, 1; calculate message size. 
    mov dx,0000h
    mov ah, 13h
    int 10h
    

    通过

     mov  ah, 03h   ; BIOS.GetCursorAndConfiguration
     int  10h       ; -> CX DX
     mov  cx, 1     ; message size
     mov  ah, 13h   ; BIOS.WriteString
     int  10h
    

    函数 13h 从 ES:BP 获取。你设置ES段寄存器了吗?


    第二个问题是打印的字符错误,如果你运行它并检查变量char,它有一个'Z'但它打印一个'T'。

    可能解决第一个问题也会解决第二个问题。


    有一种更好、更简洁的方式来输出突出显示的字符。

    printSpecial:
     push ax
     push bx
     push cx
     mov  cx, 1      ; ReplicationCount
     mov  bx, 00F0h  ; DisplayPage 0, Attribute BlackOnBrightWhite (11110000b)
     mov  al, dl     ; Character
     mov  ah, 09h    ; BIOS.WriteCharacterAndAttribute
     int  10h
     mov  ah, 0Eh    ; BIOS.TeletypeCharacter
     int  10h
     pop  cx
     pop  bx
     pop  ax
     ...
    

    函数09h会用你需要的颜色写你的字符,然后函数0Eh会正常前进光标。

    【讨论】:

    • 谢谢,我是认真的。你是一个救生员!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-20
    相关资源
    最近更新 更多