Язык ассемблера без вывода из-за счетчика - PullRequest
0 голосов
/ 16 декабря 2018

Я пытался создать код на ассемблере, который бы напоминал учебник, но я не получаю вывод и ошибок.Кто-нибудь знает, почему на экране ничего не отображается?

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 голосов
/ 17 декабря 2018
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.


Во второй части вашей программы вы отображаете все строки друг над другом, так как вы помещаете курсорв фиксированной позиции каждый раз, когда закончилось!Это фиксированное положение должно быть выбрано за пределами цикла.

Возможно, к счастью, вы этого не увидите, поскольку counter начинается с 20, что означает, что cmp counter, 20 JB L2 здесь никогда не повторится!


Кто-нибудь знает, почему на экране ничего не отображается?

Я исхожу из предположения, что ввод действительно отображается на экране,но то, что показывает окончательные результаты, ничего не дает на экране .

Помимо того, что я уже говорил выше о counter , ошибочно начинающихся с 20, есть еще одна причина для этого:

mov eax, SIZEOF myClass
mul counter

Неправильный расчет ваших строковых адресовпотому что вы использовали SIZEOF myClass там, где вам нужно SIZEOF Student.


Сброс счетчик и введение дополнительной переменной строка :

    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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...