我们已被分配为在汇编语言中执行类似数组的代码。我们使用英特尔x086架构/系统/代码。检索程序集中的数组值
我们创建的代码应该将3,4,5存储到3个不同的内存位置,我们称之为[i + EAX]。 EAX定义了内存分配。
问题是,当我们检索存储在[i + EAX]指出的内存位置内的值时,结果值是垃圾。
我们在哪里错了? 1.我们错误地添加了EAX吗?假设+1,+ 4,+8表示将下一个整数存储到下一个堆中,我们仍然得出错误的答案。这仍然是垃圾。 2.内存位置编号是六位还是十位?我们尝试了两种方式,但是记忆追踪证明我们的输出仍然是垃圾。
下面的代码:
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
请帮助我们。谢谢!
我已经在你之前的问题中用基本相同的代码回答了这个问题。 'i'是'dd 0'的标签,它将四个'0'字节组装成数据段。访问超过'[i + 4]'和以后会给你垃圾。在.bss部分使用'resd 10'来保留10个零初始化空间的dword。 –
嗨,彼得,谢谢你的评论。我们尝试添加resd 10,是的,它变成了0,但是仍然无法访问值“4”和“5”。我们做错了什么? –