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