我已经尝试了一段时间输入名称(最多20个字符)并输出。如果我在输入之后尝试输出名称,一切都很好,但如果我尝试在代码末尾附近输出它(检查箭头),它什么都不输出。在使用“#34; train"”这个词进行调配时作为输入,我看到array_name得到了字母" t"在它的第一个位置,但在我说"< ~~~~ array_name来自" T"在这条车道后到0 ~~~~"它变为0,我无法找到原因。这是我的代码,我有箭头作为与它有关的点的评论。一切都有效,除了这个小家伙。
TITLE Expression calculator (Project_4_a.asm)
; This program ………
INCLUDE Irvine32.inc
table_size EQU 8d
name_size EQU 21d ;<~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.data
array_number SWORD table_size DUP (?)
array_name WORD name_size DUP (?) ;<~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
string0 BYTE "Enter your name <max 20 characters>:", 0
string1 BYTE "Enter a degree for lesson N.", 0
string2 BYTE ":", 0
string3 BYTE "Degree for lesson N.", 0
string4 BYTE "Average deegree <student:", 0
string5 BYTE ">= ", 0
counter BYTE 0d
counter2 BYTE 0d
average WORD 0d
.code
main PROC
mov EDX, OFFSET string0
CALL WriteString
mov EDX, OFFSET array_name ;<~~~~~~~~~~~~~Read~~~~~~~~~~~~~~~~~
mov ECX, name_size ;<~~~~~~~~~~~~~~~~~~~~~Read~~~~~~~~~~~~~~~~
call ReadString ;<~~~~~~~~~~~~~~~~~~~~~~~~Read~~~~~~~~~~~~~~
;If i put the 2 lines below it outputs the string correctly.
;mov EDX, OFFSET array_name
;CALL WriteString
call Crlf
mov ECX, table_size ; ECX=8
mov EDI, 0d
L1:
mov EBX, offset array_number ;
mov EDX, OFFSET string1 ; output
CALL WriteString ; output
ADD counter, 1d ; output
MOVZX EAX, counter ; output
CALL WriteDec ; output
mov EDX, OFFSET string2 ; output
CALL WriteString ; output
CALL ReadDec ; input
ADD EBX,EDI ;
ADD EDI, type array_number
MOV [EBX], EAX ; fill array <~~~~array_name goe from "T" to 0 after this lane~~~~
CALL Crlf
LOOP L1
mov ECX, table_size
mov AX, 0d
mov ESI, offset array_number
L2:
sub ECX, 1
ADD AX, [esi + ECX * TYPE array_number]
add ECX, 1
LOOP L2
SHR AX,3
MOV average, AX ;
MOV ECX, table_size
L3:
mov EDX, OFFSET string3 ; output
CALL WriteString ; output
MOV EAX, ECX ; output
CALL WriteDec ; output
mov EDX, OFFSET string2 ; output
CALL WriteString ; output
mov ESI, offset array_number
sub ECX,1
MOV BX, [esi + ECX * TYPE array_number]
add ECX,1
MOVZX EAX, BX
CALL WriteInt
CALL Crlf
LOOP L3
mov EDX, OFFSET string4 ; output
CALL WriteString ; output
mov EDX, OFFSET array_name ; output ;<~~~~~~~~~~~~~write~~~~~~~~~~~~~~~~~~~~~~
CALL WriteString ; output ;<~~~~~~~~~~~~~~~~~~~~~~~write~~~~~~~~~~~~~~
mov EDX, OFFSET string5 ; output
CALL WriteString ; output
MOVZX EAX, average ; output
CALL WriteDec ; output
CALL Crlf
exit
main ENDP
END main
答案 0 :(得分:3)
好的,我看到这使用了一本与我没有的书相关的图书馆。
这是一个棘手的错误。问题是你将array_number
声明为一个2字节字的数组。在通过有问题的循环的第8次迭代中,EBX
寄存器将具有值array_number + 14
。然后指令MOV [EBX], EAX
执行最后一次。该指令移动 4个字节。因此它会覆盖array_number
之外的2个字节,这是array_name
的前两个字节。此外,这些是您输入的任何数字的高2字节,因此除非您输入大于255的输入,否则它们将在观察时为0。
我认为您要么将array_number
声明为类型SDWORD
,要么MOV
指令只应复制2个字节,而不是4个。
顺便提一下,您的资料库已记录在案here。这是我需要了解您的程序的信息。