【发布时间】:2014-04-28 15:29:55
【问题描述】:
我正在尝试在程序集中实现一个链接列表,所以我有一个“数组”(实际上是 20 个字节)来保存 5 个可能列表的链接。 每个“链接”长度为 5 个字节(1 个用于数据,4 个用于指针 - x86 机器)。 现在我调用 malloc 并创建了 1 个链接并将一个数字推入第一个字节(十进制数)并将链接指针移动到数组的开头。 之后我尝试再次调用 malloc 来创建一个新链接,但是创建的新链接覆盖了我已经推送到数组中的链接,我不知道为什么!!!。 这是代码和一些输入/输出示例:
section .rodata
LC0:
DB "The number is: %i", 10, 0 ; string
LC1:
DB "Memory allocation failed!!!", 10, 0 ; string
section .data
section .bss
numbers_stack:
RESB 20
link:
RESB link_size
section .text
align 16
global main
extern printf
extern malloc
extern gets
link_size EQU 5
_start:
jmp main
main:
%macro mymalloc 2 ;malloc macro
mov edx, %1 ; size to allocate
push edx
call malloc
add esp,4
test eax,eax
jz fail_exit
mov [%2], eax
%endmacro
%macro myprintf 1 ;printing macro
push %1
push LC0
call printf
add esp,8
%endmacro
mymalloc link_size,link
mov byte[link], 44
mov dword[numbers_stack],link
mov eax,0
mymalloc link_size,link ; allocate new link - *at this point the contents are allready overwritten
mov eax,[numbers_stack] ; get pointer to list head from numbers_array[0] into eax
mov edx,0
mov dl,byte[eax]
myprintf edx
输出示例: 它总是会打印出应该打印出'44'的数字'40' 如果我删除第二个 mymalloc 它将按预期打印 44,请帮忙!为什么我明明分配了新内存,它仍然指向旧内存位置?!
【问题讨论】:
标签: pointers assembly x86 nasm