我正在将字符串用户输入转换为整数并将所述整数存储在数组中。我可以在添加它们之前打印整数,并从我的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
答案 0 :(得分:0)
您发布的代码看起来不像覆盖数组。
如果从readVal
返回后已经修改了数组的第一个元素,那么mGetString
,WriteDec
,WriteString
,{{1}之一可能会出现问题无论是什么叫做。
如果在Crlf
之后第一个元素是OK,则在该点和main之间保持打印,以查看它在哪个部分被修改。或者使用调试器。
基本上无论如何都要使用调试器。在第一次尝试时编写有效的汇编程序代码并不是一件容易的事,严格按照单一指令进行编写,每个例程通常只能发现任何弱点或错误。
我曾经有一个数据优化例程,在DOS下运行正常,在Windows下运行速度快两倍......调试后我发现:检查数据是否必须优化的测试是比较一个标签的偏移量而不是内存中的值。因此在DOS下它每次运行(代码被加载到一些低地址空间),在Windows下它从未运行(代码加载在一些虚拟的0x8 ...地址)。我无法在没有调试器的情况下发现那个(我只是通过分析性能得到了暗示)。