assembly - 由于计数器而没有输出的汇编语言
问题描述
我一直在尝试在汇编中编写一个类似于成绩簿的代码,但我没有得到任何输出,也没有错误。有谁知道为什么屏幕上什么都没有显示?
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
解决方案
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
永远不会在这里重复!
有谁知道为什么屏幕上什么都没有显示?
我假设输入确实显示在屏幕上,但显示最终结果不会在屏幕上产生任何内容。
除了我上面已经说过的counter错误地从 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
推荐阅读
- javascript - 预期条件失败:等待包含 style="display: none;" 的元素可点击元素
- performance - 是否应该将结构元组作为记忆函数的参数?
- angular - 调用 Observable 并在里面订阅
- spring - Spring Data 自定义基础仓库 elasticsearchrepository
- azure-devops - VSTS 扩展:从新的 repo 初始化或创建一个 master 分支
- uwp - UWP Wifi Direct 获取异常代码 0x288 (ERROR_DEVICE_ENUMERATION_ERROR)
- python-3.x - 如何将 Excel 和 Python 打包在一起并分发给业务用户?
- php - 如何从 MySQL 中获取数据作为数组并根据 PHP 中的下拉选择动态填充文本字段
- polymer - 聚合物初始化(无响应)
- c - 以乘法格式显示的素数因子