Project Assembly - 如何为Project Assembly“学习元音字母”代码添加标记?

Project Assembly -How To Add Mark to Project Assembly " Learning Vowel Letters" code?

这是我的小项目汇编代码,大约"earning Vowel Letters"。 它正在工作,但问题结束时未添加标记。 5个问题,最迟必须加分,但没有加分。 每个正确答案都会加分。

第 1 页:学习
第 2 页:考试
第 3 页:退出

就像这样它工作。

; multi-segment executable file template.

data segment                                                                                                                         
 firstpage db "learning Vowel letters e,o,a,i,u",10,13,"create by:alex",10,13,"1.stady",10,13,"2.exam",10,13,"3.exit" ,10,13,"$"
  std1 db "Umbrella  ----> an Umbrella" ,10,13,"$"
  std2 db "bird ----> a bird ",10,13,"$"
  std3 db "Ice cream ----> an Ice cream",10,13," $"
  std4 db "car----> a car ",10,13,"$"  
  std5 db "Orange ---->an Orange",10,13," $"

    qone db "desk ____ desk"   ,10,13,"a) a",10,13,"b) an",10,13,"$"
    qtow db "apple ____apple"   ,10,13,"a) a",10,13,"b) an",10,13,"$"
    qth db "table ____ table"  ,10,13,"a) a",10,13,"b) an",10,13,"$"
    qfo db "egg ____ egg"     ,10,13,"a) a",10,13,"b) an",10,13,"$"
    qfi db "red ____ red"     ,10,13,"a) a",10,13,"b) an",10,13,"$"  

    nl    db 0,10,13,"$"

   markze db "your mark is :0$"
   markone db "your mark is :10$" 
   marktow db "your mark is :40$" 
   markth db "your mark is :60$" 
   markfo db "your mark is :80$" 
   markfi db "your mark is :100$" 

   count db 0

ends

stack segment
    dw   128  dup(0)
ends                                
code segment
start:

    mov ax, data
    mov ds, ax

    lea dx, firstpage
    mov ah, 9
    int 21h           
    mov ah,7
    int 21h
    mov dl,al
    cmp dl,"1" 
    je  t1
    cmp dl,"2"
    je t2 
    cmp dl,"3"
    je soof 

 t1:  mov ax,3
    int 10h


    lea dx,std1
    mov ah,9
    int 21h
    mov ah,7
    int 21h


       lea dx,std2 
    mov ah ,9   
    int 21h
    mov ah,7
    int 21h

       lea dx,std3 
    mov ah,9
    int 21h
    mov ah,7
    int 21h


       lea dx,std4
    mov ah,9
    int 21h
    mov ah,7
    int 21h

       lea dx,std5
    mov ah,9
    int 21h
    mov ah,7
    int 21h   


    lea dx, firstpage
    mov ah, 9
    int 21h           
    mov ah,7
    int 21h



 t2:   mov ax,3
       int 10h

    lea dx ,qone
    mov ah,9
    int 21h 
    lea dx,nl
    mov ah,9
    int 21h
    mov ah,1
    int 21h
     mov ah,7
    int 21h

    mov bl,ah 
    cmp bl,"a"
    je c1 

    cmp bl,"b"
    je c0



       lea dx ,qtow

    mov ah,9
    int 21h 
    lea dx,nl
    mov ah,9
    int 21h
    mov ah,1
    int 21h


    mov bl,ah
    cmp bl,"b"
    je c2 

    cmp bl,"a"
    je c0





       lea dx ,qth
     mov ah,9
    int 21h 
    lea dx,nl
    mov ah,9
    int 21h
    mov ah,1
    int 21h
    mov bl,ah 

    cmp bl,"a"
    je c3

    cmp bl,"b"
    je c0





      lea dx ,qfo
    mov ah,9
    int 21h 

    lea dx,nl
    mov ah,9
    int 21h 

    mov ah,1
    int 21h



   mov bl,ah    
   cmp bl,"b"
   je c4

   cmp bl,"a"
   je c0



       lea dx ,qfi
     mov ah,9
    int 21h 
    lea dx,nl
    mov ah,9
    int 21h
    mov ah,1
    int 21h 

    mov bl,ah
    cmp bl,"a" 
    je c5
    cmp bl,"b"
    je c0  

 c0:
    cmp count,0
    je mark0 

 c1:
    cmp count,1
    je mark1


 c2:
    cmp count, 2
    je mark2

 c3:
    cmp count, 3
    je mark3 

 c4:
     cmp count,4
    je mark4

 c5:
    cmp count,5
    je mark5



 mark0:
       lea dx,markze
       mov ah,9
       int 21h
       jmp soof

 mark1:
       lea dx,markone
       mov ah,9
       int 21h
       jmp soof

 mark2:
       lea dx,marktow
       mov ah,9
       int 21h
       jmp soof 

 mark3:
       lea dx,markth
       mov ah,9
       int 21h
       jmp soof

 mark4:
       lea dx,markfo
       mov ah,9
       int 21h
       jmp soof
 mark5:
       lea dx,markfi
       mov ah,9
       int 21h
       jmp soof 




  soof:  mov ax, 4c00h 
    int 21h    
ends

end start 
nl    db 0,10,13,"$"

我认为来自 My assembly "quiz Multiply" code is not working? 的回答者的意思是您要写:nl db 10,13,"$"(没有 zero/comma)


为什么这个版本不起作用

输入错误

mov ah,1
int 21h
mov ah,7
int 21h
mov bl,ah 

这两个DOS函数都从键盘输入一个字符。函数 01h 使用 echo 和函数 07h 不使用 echo.
这两个函数所做的就是将结果留在 AH 寄存器中,您稍后将其复制到 BL 寄存器。 结果总是只在AL寄存器中。当然你只需要在这里包含这些功能之一。

mov ah, 01h
int 21h
mov bl, al 

程序流程错误。

cmp bl,"a"
je c1
cmp bl,"b"
je c0
lea dx ,qtow
mov ah,9
int 21h

如果用户对第一个问题给出了正确答案 (a),您将跳转到 c1,在那里您尝试奖励分数并终止程序。
如果用户对第一个问题给出了错误的答案 (b),您将跳转到 c0,在那里您尝试奖励(零)分数并终止程序。
只有当用户提供非法输入时,您才会向他们提出第二个问题。
明显逻辑有问题!

你应该做的是在每次给出正确答案时递增 count 变量。在代码中,这意味着如果未给出正确答案绕过 inc 指令

    ...
    mov ah, 01h
    int 21h
    cmp al, "a"     ; Correct answer to 1st question
    jne Q2          ; was not given
    inc count
Q2:
    lea dx, qtow
    mov ah, 09h
    int 21h
    mov ah, 01h
    int 21h
    cmp al, "b"     ; Correct answer to 2nd question
    jne Q3          ; was not given
    inc count
Q3:
    lea dx, qth
    mov ah, 09h
    int 21h
    ...

处理最后一个问题的第五个部分可以在将在屏幕上打印标记的代码中通过。

    ...
Q5:
    lea dx, qfi
    mov ah, 09h
    int 21h
    mov ah, 01h
    int 21h
    cmp al, "a"     ; Correct answer to 5th question
    jne c0          ; was not given
    inc count
c0:
    ...