2014-04-11 61 views
0

我有一个问题,理解为什么我的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

您忘记了如何使用inputatod。看着我的水晶球,我猜input需要一个缓冲区来存储用户输入文本,参数50大概是它的大小。请注意,您没有这样的缓冲区,甚至没有50个字节的空间。我也认为,因为atod显然只有1个参数,这是要转换的文本缓冲区,所以它可能返回eax中的值。这也由你的storeValueal写道这一事实进一步加强,否则就没有意义了。

长话短说:

  1. 分配为输入的文本
  2. 通过这个数组atod
  3. 不揍al,来电后atod
适当大小的缓冲区

(也适用搜索关键词)

+0

对不起,我是s直到学习80x86 asm,我假设atod和输入是本书解释它的标准语法。仔细研究它,我发现它们是宏。虽然谢谢!我明白了,在我从EAX调用atod到[EBX]之后,我愚蠢地忘了移动这个值,从而解决了我的问题。谢谢! – Arcath