大会没有正常跳跃

时间:2014-04-11 21:13:40

标签: arrays loops assembly

我在理解为什么我的cmp语句无法正常工作时遇到了问题。

当我运行它时,我先输入0然后转到storeValue。我为第二个值输入0,它会像它应该的那样进入searchArray。

我的cmp和跳转语句以及对AL的监视都有断点,所以我不明白为什么它应该在该点提示搜索值时存储前0。

谢谢你的期待。

.DATA
prompt1     BYTE    "Enter a value to put in array or 0 to search array.", 0
prompt2     BYTE    "Enter a value to search array for.",0                         
intArray    DWORD   ?
numElem     DWORD   0
SearchVal   DWORD   ?

resultNope  BYTE    "Not in array.",0

.CODE
_MainProc PROC
            lea     ebx, intArray           ;get the address of array.
start:      input   prompt1, intArray, 50   ;read in integer
            atod    intArray                ;convert to int

            mov     al, [ebx]               ;move int to register
            cmp     al, 0                   ;if integer is positive - store it!
            jg      storeValue              ;JUMP!

            cmp     al, 0                   ;if 0 - time to search array!
            je      searchArray             ;JUMP!

storeValue: add     numElem, 1              ;Adds 1 to num of elements in array.
            mov     [ebx], al               ;moves number into array.
            add     ebx, 1                  ;increment to next array address.
            jmp     start                   ;get next number for array. JUMP!

searchArray:input   prompt2, searchVal, 50  ;What are we searching array for?
            atod    searchVal               ;convert to int
            lea     ebx, intArray           ;get address of array.
            mov     ecx, 1                  ;set loop counter to 1.

1 个答案:

答案 0 :(得分:1)

您忘记了inputatod的工作原理。看看我的水晶球,我想input期望缓冲区将用户输入存储为文本,而参数50可能是它的大小。请注意,您没有这样的缓冲区,甚至没有50个字节的空间。我也认为,因为atod显然只需要一个参数,即要转换的文本缓冲区,它可能会返回eax中的值。你的storeValue来自al写的这一事实也强化了这一点,否则就没有意义。

长话短说:

  1. 为输入的文本分配适当大小的缓冲区
  2. 将此数组传递给atod
  3. 在致电al
  4. 后不要破坏atod

    (也适用于搜索部分。)