MASM访问并添加到数组的第一个元素

时间:2016-07-31 02:50:33

标签: assembly x86 masm

我正在将字符串用户输入转换为整数并将所述整数存储在数组中。我可以在添加它们之前打印整数,并从我的ReadVal过程中的数组中打印出来,数字与键盘输入匹配。

然而,当我尝试在main中打印数组的第一个元素时,我会得到一个非常不同的数字。第2,第3和第4印刷准确。当我存储以第二个元素开头的整数时,我没有问题,所有内容都被正确存储。在程序完成后,第一个元素会改变什么?

我如何在main中打印第一个元素:

mov     esi, OFFSET array
mov     eax, [esi]
call    WriteDec

Printing the second:
mov     esi, OFFSET array
mov     eax, [esi + 4]
call    WriteDec

如果它有帮助,这是我的代码,用于读取字符串中的整数并将它们转换为数字:

  readVal PROC
    push    ebp
    mov     ebp, esp

    mov     edi, [ebp + 24]     ; @array

    getString:
        xor     edx, edx
        mov     eax, edi ; Address of current element in array
        sub     eax, [ebp + 24] ; subtract the starting address from the current
        cmp     eax, 40 ; If 10 DWORDS have been added to the array, jump to finish
        je      readValFinish   

        mGetString [ebp + 8] ; store value in @dString

        ; Convert the string to numeric value
        mov     esi, [ebp + 8] ; @dString
        mov     ecx, eax         ; length of the string

        ;Set X to 0
        mov     ebx, 0
        cld             ; Set direction to forward
    convertNext:
        lodsb       ; Gets the char in AL
        cmp     al, 48
        jl      outOfRange
        cmp     al, 57
        jg      outOfRange
        jmp     goodChar

    outOfRange:
        mov     edx, [ebp + 16]
        call    WriteString
        call    Crlf
        ;mov        eax, 0   ;Signals they guessed an invalid number
        jmp     getString

    ; If it's a valid character, add it to the total    
    goodChar:
        ; subtract 48
        sub     al, 48
        push        eax
        ; multiply x by 10
        mov     eax, ebx
        ;call   WriteDec
        mov     ebx, 10
        mul     ebx
        mov     ebx, eax ; x back in ebx
        pop     eax    
        add     ebx, eax 

    loop    convertNext
    call    Crlf

    ; If valid, add numeric value (EBX) to an array
    mov     eax, ebx
    call    WriteDec

    mov     [edi], eax

    mov     eax, [edi]
    call    WriteDec

;   xor     eax, eax
;   mov     eax, [edi]
;   call    WriteDec

    add     edi, 4      ;Move to the next position

    jmp     getString

readValFinish:
    pop     ebp
    ret     20  ; 5 pushed on the stack

readVal ENDP

1 个答案:

答案 0 :(得分:0)

您发布的代码看起来不像覆盖数组。

如果从readVal返回后已经修改了数组的第一个元素,那么mGetStringWriteDecWriteString,{{1}之一可能会出现问题无论是什么叫做。

如果在Crlf之后第一个元素是OK,则在该点和main之间保持打印,以查看它在哪个部分被修改。或者使用调试器

基本上无论如何都要使用调试器。在第一次尝试时编写有效的汇编程序代码并不是一件容易的事,严格按照单一指令进行编写,每个例程通常只能发现任何弱点或错误。

我曾经有一个数据优化例程,在DOS下运行正常,在Windows下运行速度快两倍......调试后我发现:检查数据是否必须优化的测试是比较一个标签的偏移量而不是内存中的值。因此在DOS下它每次运行(代码被加载到一些低地址空间),在Windows下它从未运行(代码加载在一些虚拟的0x8 ...地址)。我无法在没有调试器的情况下发现那个(我只是通过分析性能得到了暗示)。