我们已被指派在汇编语言中执行类似数组的代码。我们使用的是英特尔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
请帮助我们。谢谢!
答案 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并在之后弹出。