检索程序集

时间:2016-02-27 06:27:18

标签: arrays assembly

我们已被指派在汇编语言中执行类似数组的代码。我们使用的是英特尔x086架构/系统/代码。

我们创建的代码应该将3个,4个,5个存储到3个不同的内存位置,我们称之为[i + EAX]。 EAX定义了内存分配。

这个问题是,当我们检索存储在[i + EAX]指出的内存位置内的值时,结果值是垃圾。

我们哪里错了? 1.我们错误地添加了EAX吗?假设+1,+ 4,+ 8表示将下一个整数存储到下一个堆中,我们仍然得到了错误的答案。它仍然是垃圾。 2.内存位置编号是hexa还是deci?我们都试过了,但内存跟踪证明我们的输出仍然是垃圾。

以下是代码:

global _main
extern _system, _printf

section .text           

_main:

; clear screen
push clr
call _system
add esp, 4

MOV EAX, 0001
MOV EBX, 0003

;FIRST - Initialize to 3.
MOV dword [i+EAX], EBX
push dword [i+EAX]
push prompt
call _printf      
add esp, 8
ADD EAX, 0008    ; Assuming next memory space will be allocated at 0009
INC EBX          ; add value, to increase to 4.

;SECOND - Initialize to 4.
MOV dword [i+EAX], EBX
push dword [i+EAX]
push prompt
call _printf      
add esp, 8
ADD EAX, 0008
INC EBX;

;THIRD - Initialize to 5.
MOV dword [i+EAX], EBX
push dword [i+EAX]
push prompt
call _printf      
add esp, 8

;RETRIEVE FIRST - Which should be "3"
 MOV EAX, 0001
 push dword [i+EAX]
 push prompt
 call _printf      
 add esp, 8

; RETRIEVE SECOND - Which should be "4", but shows garbage value. Why?
  MOV EAX, 0002 
  push dword [i+EAX]
  push prompt2
  call _printf      
  add esp, 8

  ret

  section .data
    clr         db "cls",0
    prompt  db "Value is %d",13,10,0    
    prompt2 db "EAX testing X is %x",13,10,0      
    prompt3 db "EAX testing D is %d",13,10,0      
    i       dd 0

请帮助我们。谢谢!

1 个答案:

答案 0 :(得分:3)

您没有说明您使用的是哪种操作系统/通话惯例,所以我必须做一些猜测。

首先,为什么第一个值将EAX设置为1?您只需确保未对齐的访问权限并跳过一个字节的内存。将其设置为零。

其次,在调用EAX时,您不会存储_printf的值。最有可能_printf将其返回值存储在EAX中,因此下次向EAX添加8时,它不会是9,但它会完全不同。

即使_printf未将其返回值存储在EAX中,您也不会使用下一个dword,即4。请参阅下一点。

第三,当打印出值时,您突然使用EAX的值1和2来访问值i,这当然不会给您一个接一个地给出两个dword。您将访问完全不同的内存区域。您必须使用相同的值来保存和检索值。

因此,即使EAX未被修改,您也会以字节i + 1 - i + 4,然后i + 9 - i + 12然后i + 13 - i + 16存储内容。然后在打印时,您正在访问字节i + 1 - i + 4和i + 2 - i + 5。正如您所看到的,您永远不会写入i + 5,因此它将包含垃圾。

明确地将EAX设置为0,4,8等。不要添加任何东西。然后查看存储的内容和输出内容。如果你真的需要使用添加(这里你不是),也可以在调用时推送EAX并在之后弹出。