读取输入(名称),存储并输出

时间:2014-06-11 22:36:47

标签: assembly x86 output masm irvine32

我已经尝试了一段时间输入名称(最多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

1 个答案:

答案 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。这是我需要了解您的程序的信息。