计数器导致无输出的汇编语言

时间:2018-12-16 19:25:24

标签: assembly x86 output irvine32

我一直试图在汇编中编写类似于成绩簿的代码,但没有任何输出,也没有错误。有谁知道为什么屏幕上什么都没有显示?

INCLUDE Irvine32.inc


Student STRUCT
    myName BYTE 26 DUP(00h)
    myGrade BYTE 26 DUP(00h)
Student ENDS


.data
myClass Student 20 DUP(<>)
myNumber BYTE 3 DUP(00h)
nameQuestion BYTE "What is your name?",0dh,0ah,0
gradeQuestion BYTE "Please enter ",0
grade2Question BYTE "'s grade.",0dh,0ah,0
myName BYTE 26 DUP(00h)
myGrade BYTE 26 DUP(00h)
linebreak BYTE 0dh,0ah,0
comma BYTE ","
space BYTE " "
counter BYTE 0
.code
main PROC

R1: call Clrscr

    mov edx,OFFSET nameQuestion
    call WriteString

    mov edx,OFFSET myName
    mov ECX,26

    mov eax, SIZEOF Student
    mul myNumber
    mov esi,eax
    lea edx, (Student PTR myClass[esi]).myName 

    call ReadString

    cmp eax, 00h
    JE R2
    call Clrscr


R3: mov edx,OFFSET gradeQuestion
    call WriteString

    mov edx,OFFSET myName
    call WriteString

    mov edx,OFFSET grade2Question
    call WriteString

    mov edx,OFFSET myGrade
    mov ECX,26

    mov eax, SIZEOF Student
    mul myNumber
    mov esi,eax
    lea edx, (Student PTR myClass[esi]).myGrade

    call ReadString
    inc myNumber

L1: CMP myGrade, "A"
    JE R5
    CMP myGrade, "B"
    JE R5
    CMP myGrade, "C"
    JE R5
    CMP myGrade, "D"
    JE R5
    CMP myGrade, "F"
    JE R5
R5: inc counter
    CMP counter,20
    JNE R1  

R4: call Clrscr


L2: mov dh,3
    mov dl,5
    call Gotoxy
    inc dh

    mov eax, SIZEOF myClass
    mul counter
    mov esi, eax
    lea edx, (Student PTR myClass[esi]).myName
    call WriteString


J1: mov eax, 07h
    CMP myGrade, "D"
    JNE J2
    mov eax, 0Eh
J2: CMP myGrade, "F"
    JNE J3
    mov eax, 04h
J3: Call SetTextColor

    mov dh,3
    mov dl,32
    call Gotoxy
    inc dh

    mov eax, SIZEOF myClass
    mul counter
    mov esi, eax
    lea edx, (Student PTR myClass[esi]).myGrade
    call WriteString

    inc counter
    cmp counter, 20
    JB L2

    mov edx, OFFSET linebreak
    call WriteString

    mov eax, 07h
    Call SetTextColor

    call WaitMsg
    jmp R1
R2: exit
main ENDP

END main

1 个答案:

答案 0 :(得分:0)

mov edx,OFFSET myName
mov ECX,26

mov eax, SIZEOF Student
mul myNumber
mov esi,eax
lea edx, (Student PTR myClass[esi]).myName 

call ReadString

您直接在20个数组元素之一中输入,但是稍后您的代码将依赖于单个 myName 缓冲区中不存在的内容。 myGrade 缓冲区中不存在的内容也会发生同样的情况。
我建议您输入单个缓冲区,然后将内容复制到相关的数组元素。与此复制一起,您可以考虑验证,修剪,大写等等。

无论结果如何,所有这些不同的年级比较都将始终以 R5 标签结尾。因此,程序的顶部始终将循环20次,而离开counter=20


在程序的第二部分中,由于每次都将光标置于固定位置,因此所有字符串都显示在彼此的顶部!必须在循环之外选择此固定位置。

幸运的是,由于计数器从20开始,您可能没有看到这种情况,这意味着cmp counter, 20 JB L2在这里永远不会重复!


  

有人知道为什么屏幕上什么都没有显示吗?

我假设输入确实会在屏幕上显示出来,但是显示最终结果不会在屏幕上产生任何效果

除了我上面所说的关于计数器的错误(从20岁开始),还有其他原因:

mov eax, SIZEOF myClass
mul counter

您的字符串地址计算错误,因为您在需要SIZEOF myClass的地方使用了SIZEOF Student


重置计数器并引入一个额外的变量 row

    mov     counter, 0
    mov     row, 3

L2:
    mov     dh, row
    mov     dl, 5
    call    Gotoxy
    mov     eax, SIZEOF Student
    mul     counter

    ... display Student.myName

    mov     dh, row
    mov     dl, 32
    call    Gotoxy
    mov     eax, SIZEOF Student
    mul     counter

    ... display Student.myGrade

    inc     row
    inc     counter
    cmp     counter, 20
    JB      L2