汇编程序(TASM x64)数组和元素

时间:2014-02-25 13:58:10

标签: windows assembly x86 dos tasm

我有九个名字的数组:

.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

1 个答案:

答案 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,2INC BX INC BX完成的,这意味着MOV CX,2会是不必要的 - 只是我写它的方式......)并将'1'中的AH增加到'2'

循环的结束条件是AH'9'增加到 - 井,':''9'+1。如果尚未达到该结束条件,则在循环中运行,直到测试了所有值'1' .. '9'。如果你还没有PNAME,那么就会出现错误,因为不允许输入字符,所以指向错误信息然后打印出来。

现在跳到最后 - 可能你想要终止程序,所以你要执行

  MOV AH,4CH
  INT 21H