Assembly 由于计数器而没有输出的汇编语言
我一直试图在汇编中编写一个类似成绩册的代码,但我没有得到任何输出,也没有错误。有人知道为什么屏幕上没有显示任何内容吗Assembly 由于计数器而没有输出的汇编语言,assembly,x86,output,irvine32,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
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
包括Irvine32.inc
学生结构
myName字节26 DUP(00h)
myGrade字节26 DUP(00h)
学生终点
.数据
我的班级学生20 DUP()
myNumber字节3 DUP(00h)
名称问题字节“你叫什么名字?”,0dh,0ah,0
问题字节“请输入”,0
GRADE2问题字节“'s grade.”,0dh,0ah,0
myName字节26 DUP(00h)
myGrade字节26 DUP(00h)
换行符字节0dh,0ah,0
逗号字节“,”
空格字节“”
计数器字节0
.代码
主进程
R1:调用clrsc
mov edx,偏移量名称问题
通话记录
mov edx,偏移量myName
莫夫埃克斯,26
mov eax,学生尺寸
mul我的号码
电影esi,eax
lea edx,(学生PTR myClass[esi]).myName
调用读取字符串
cmp-eax,00h
日本脑炎R2
调用Clrscr
R3:mov edx,补偿问题
通话记录
mov edx,偏移量myName
通话记录
mov edx,补偿等级2问题
通话记录
移动edx,偏移myGrade
莫夫埃克斯,26
mov eax,学生尺寸
mul我的号码
电影esi,eax
lea edx,(学生PTR myClass[esi])myGrade
调用读取字符串
我的公司号码
L1:CMP myGrade“A”
日本脑炎R5
“B”级
日本脑炎R5
CMP myGrade,“C”
日本脑炎R5
CMP myGrade,“D”
日本脑炎R5
CMP myGrade,“F”
日本脑炎R5
R5:inc计数器
CMP计数器,20
JNE R1
R4:调用CLRSC
L2:mov dh,3
mov dl,5
打电话给Gotoxy
有限公司
mov eax,myClass的大小
mul计数器
电影esi,eax
lea edx,(学生PTR myClass[esi]).myName
通话记录
J1:mov eax,07h
CMP myGrade,“D”
JNE J2
mov-eax,0Eh
J2:CMP myGrade,“F”
JNE J3
mov-eax,04h
J3:调用SetTextColor
莫夫dh,3
mov dl,32
打电话给Gotoxy
有限公司
mov eax,myClass的大小
mul计数器
电影esi,eax
lea edx,(学生PTR myClass[esi])myGrade
通话记录
公司柜台
cmp计数器,20
JB L2
移动edx,偏移换行符
通话记录
mov-eax,07h
调用SetTextColor
打电话给WaitMsg
jmp-R1
R2:退出
主端
端干管
您直接输入20个数组元素中的一个,但稍后您的代码将依赖于单个myName缓冲区中不存在的内容。
来自单个myGrade缓冲区的不存在内容也会发生同样的情况。我建议您输入单个缓冲区,然后将内容复制到相关数组元素。与此复制一起,您可以考虑验证、修剪、大写等。 无论结果如何,所有这些不同等级的比较结果都会出现在R5标签中。因此,程序的顶部将始终循环20次,留下
counter=20
在程序的第二部分中,由于每次都将光标放置在一个固定位置,因此您可以将所有字符串显示在彼此的顶部!必须在回路外部选择此固定位置 也许有点幸运,因为计数器从20开始,所以您没有看到这种情况发生,这意味着
cmp计数器,20
jbl2
将永远不会在这里重复
有人知道为什么屏幕上没有显示任何内容吗
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
我同意这样的假设,输入确实会显示在屏幕上,但是显示最终结果不会在屏幕上产生任何结果
除了上面我已经说过的计数器错误地从20开始外,还有一个原因:
mov eax, SIZEOF myClass
mul counter
字符串地址的计算是错误的,因为您在需要SIZEOF Student
的地方使用了SIZEOF myClass
重置计数器并引入额外的变量行:
在您对这个()的回复中,您似乎在说
main
顶部的mov-edx,OFFSET-nameQuestion
/调用WriteString
是否产生输出?你不是这么说的。你说整个程序根本不产生任何输出。(这可能表明您的开发设置存在某种问题,但这并不是问题的一部分:甚至不接近最小值。这就是我投反对票的原因)。如果您有新的信息要添加,请编辑您的问题,而不是重新发布。imul esi,[myNumber],如果您要建议优化,学生的大小将更好。与大多数指令不同,一个单独的dst和src,因为它不会为额外的操作码位接管ModRM字节的/r
字段。大多数汇编程序都支持使用src=dst将其写入2操作数指令。您确定MASM将mul myNumber
汇编为DWORD操作数大小吗?该符号是根据字节定义的,为什么它不是多字节ptr[myNumber]
?没有什么能暗示德沃德。(但是IDK这怎么可能会导致问题,因为EAX的上层字节应该已经从mov EAX,SIZEOF Student
中为零)这看起来仍然像是一个bug,但是除非我遗漏了一些东西,并且它确实使用DWORD大小进行了组装,否则它实际上可能不会导致错误,而不是以64kiB偏移量包装。
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