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