我有九个名字的数组:
.model tiny
.data
vardas1 db "Rokas",0ah,'$'
vardas2 db "Tomas",0ah,'$'
vardas3 db "Matas",0ah,'$'
vardas4 db "Domas",0ah,'$'
vardas5 db "Augis",0ah,'$'
vardas6 db "Vofka",0ah,'$'
vardas7 db "Marka",0ah,'$'
vardas8 db "Auris",0ah,'$'
vardas9 db "Edvis",0ah,'$'
vardai dw offset vardas1, offset vardas2, offset vardas3, offset vardas4, offset vardas5, offset vardas6, offset vardas7, offset vardas8, offset vardas9
.code
org 100h
我需要从键盘读取一个数字,然后我需要打印该名称。例如,我将推5,控制台应写“Augis”。顺便说一句,第二个代码块不是所有代码,只是循环不起作用
paieska:
mov dx, offset _comment1 ; Just string name asking user to input digit
mov ah, 9
int 21h
mov j, 00h ; Trying to input the digit from keyboard
mov ah, 01h
mov dl, 0ah
int 21h
mov bx, offset vardai ; Add array "names" to bx register
add bx, cx ; Add cx for indexing
mov dx, [bx] ; Add first array element to dx register
add cx, 2 ; Increasing cx by 2, because I'm using data word not data byte
mov ah, 9 ; Try to print it
int 21h
cmp cx, j ; Try to compare cx (index of array) to mine inputed digit "j"
jne paieska
je end
答案 0 :(得分:0)
mov ah, 01h
mov dl, 0ah ;NO NEED FOR THIS - INT21/01 DOES NOT USE DL
int 21h
MOV AH, '1' ; MIN INPUT CHAR
mov bx, offset vardai ; Add array "names" to bx register WELL, ASSIGN ACTUALLY
MOV CX,2 ;NUMBER OF BYTES TO ADD (WORDS, NOT BYTES)
LOOPN:
mov dx, [bx] ; name-pointer array element to dx register
CMP AH,AL ; MATCHING char?
JE PNAME ; YES, PRINT NAME
add bx, cx ; Add cx=2 for next name
inc AH ; next possible character input
CMP AH,'9'+1 ; allowed is '1'..'9'
jne loopn ; in allowed range
; input not 1..9
mov dx, offset errormessage
PNAME:
mov ah, 9 ; Try to print it
int 21h
jmp end
好吧,我尝试用CAPS编辑你的方法,但它变得太复杂了。
基本上,您正在使用函数01
从键盘上读取一个字符。这个角色到达AL。如果一切顺利,它应该是'1'..'9'。请注意,这些是ASCII字符'1'..'9',即十六进制31..39
下一步是将BX
设置为表的开头,将AH
设置为您预期的最小字符,将CX
设置为2,因为该表包含单词,而不是字节。
现在我们有一个循环。从表格中加载X
,然后检查AL
是否等于AH
。如果用户输入1
,则它们将相等,因此请打印字符串。
否则,添加2到BX
以指向表格中的下一个条目(这可能是由ADD BX,2
或INC BX INC BX
完成的,这意味着MOV CX,2
会是不必要的 - 只是我写它的方式......)并将'1'
中的AH
增加到'2'
。
循环的结束条件是AH
从'9'
增加到 - 井,':'
或'9'+1
。如果尚未达到该结束条件,则在循环中运行,直到测试了所有值'1'
.. '9'
。如果你还没有PNAME
,那么就会出现错误,因为不允许输入字符,所以指向错误信息然后打印出来。
现在跳到最后 - 可能你想要终止程序,所以你要执行
MOV AH,4CH
INT 21H