0

这是我目前正在做的事情的新更新。我对如何使用存储在 S2 中的数据在整个屏幕中搜索相同的单词感到困惑。如果找到突出显示的单词。

DOSBOX - 编译器:A86

org 100h
;-----------------------------------------------------
lea bp, S1    
mov cx, 35 
mov al, 1   
mov ah, 13h 
mov bh, 0 
mov dl, 0
mov dh, 25
mov bl, 7
int 10h   
;----------------------------------------------------------            ; Asks input'
mov di,1
start:
mov ah, 0
int 16h
mov dx,ax
mov ah, 0eh
cmp dx,4d00h 
je start2
int 10h
mov S2[di], al
inc di
jmp start 

start2 :
mov cx,di
mov di,1
mov si,0

relop :
mov ah,[si]
cmp ah,S2[di]

mov al, 13h
    mov ah, 0
    int 10h     ; set graphics video mode. 
    mov al, 1100b
    mov cx, 10
    mov dx, 20
    mov ah, 0ch
    int 10h     ; set pixel. 

inc di
add si,2
je  relop 

mov ah, 13h 
lea bp, S2
mov al, 1
mov bh, 0
mov bl, 7
mov dl, 0
mov dh, 25
int 10h 



MOV AH, 4CH
INT 21H







S1 DB "EENTER THE WORD TO FIND ON SCREEN : "  
S2 db 1 dup (?) 







; ========= data ===============

我不能使用 int 21h 进行输入和输出,而只能结束程序( return )

4

1 回答 1

1
mov dl, 0
mov dh, 25

您正在将提示打印到屏幕之外!坐标是从零开始的,对于标准文本屏幕上的行,它们的范围是 0 到 24。


 mov si,0
relop :
 mov ah,[si]
 cmp ah,S2[di]
 mov al, 13h
 mov ah, 0
 int 10h     ; set graphics video mode. 

如果您想从屏幕上阅读,那么您绝对不应该在此检索循环的每次迭代中设置一个新屏幕!此外,将 SI 寄存器初始化为 0 不会到达输入单词的第一个字符。

解决方案:

在屏幕的第一行显示 35 个字符长的提示 ( mov dh,0)。现在您知道输入的字将在显存偏移地址 70 处,但在显存段中。

 mov ax,0B800h
 mov es,ax
 mov si,70
relop :
 es mov ah,[si]  <-- This is the ASCII code of the 1st inputted character

最好也进行以下更正:

S1 DB "ENTER THE WORD TO FIND ON SCREEN : "  
S2 db 44 dup (?)
于 2016-08-19T16:55:00.497 回答