x86 Assembly pushl/popl don’t work with “Error: suffix or operands invalid”
- alloc.s源代码 添加
.code32
到汇编代码的顶部
# 目的:用于管理内存使用的程序——按需分配和释放内存
#
# 注意:使用这些例程的程序将要求一定大小的内存,在实际操作中,我们使用的内更大,但在回传指针前将之放在开始处,。我们增加一个大小子段,以及一个
# AVAILABLE/UNAVAILABLE标记。
# 因此,内存看起来如下所示
#
# ####################################################################################
# #AVAILABLE标记#内存大小#实际内存位置#
# ####################################################################################
# ^--返回指针指向此处
# 为了方便调用程序,返回的指针仅仅指向所请求的实际内存位置,这也让我们无需更改调用程序即可更改结构
#
.code32
.section .data
########## 全局变量 ########
# 此处指向我们管理的内存的起始处
heap_begin:
.long 0
# 此处指向我们管理的内存之后的一个位置
current_break:
.long 0
########## 结构信息 ########
# 内存区头空间大小
.equ HEADER_SIZE,8
# 头中AVAILABLE表示的位置
.equ HDR_AVAIL_OFFSET,0
# 内存区头中大小子段的位置
.equ HDR_SIZE_OFFSET,4
.equ UNAVAILABLE,0
.equ AVAILABLE,1
.equ SYS_BRK,45
.equ LINUX_SYSCALL,0x80
.section .text
## allocate_init ##
.globl allocate_init
.type allocate_init,@function
allocate_init:
pushl %ebp
movl %esp,%ebp
movl $SYS_BRK,%eax
movl $0,%ebx
int $LINUX_SYSCALL
incl %eax
movl %eax,current_break
movl %eax,heap_begin
movl %ebp,%esp
popl %ebp
ret
## allocate ##
.globl allocate
.type allocate,@function
.equ ST_MEM_SIZE,8
allocate:
pushl %ebp
movl %esp,%ebp
movl ST_MEM_SIZE(%ebp),%ecx
movl heap_begin,%eax
movl current_break,%ebx
alloc_loop_begin:
cmpl %ebx,%eax
je move_break # 这里是否应该是jge
movl HDR_SIZE_OFFSET(%eax),%edx
cmpl $UNAVAILABLE,HDR_AVAIL_OFFSET(%eax)
je next_location
cmpl %edx,%ecx
jle allocate_here
next_location:
addl $HEADER_SIZE,%eax
addl %edx,%eax
jmp alloc_loop_begin
allocate_here:
movl $UNAVAILABLE,HDR_AVAIL_OFFSET(%eax)
addl $HEADER_SIZE,%eax
movl %ebp,%esp
popl %ebp
ret
move_break:
addl $HEADER_SIZE,%eax
addl %ecx,%ebx
pushl %eax
pushl %ecx
pushl %ebx
movl $SYS_BRK,%eax
int $LINUX_SYSCALL
cmpl $0,%eax
je error
popl %ebx
popl %ecx
popl %eax
movl $UNAVAILABLE,HDR_AVAIL_OFFSET(%eax)
movl %ecx,HDR_SIZE_OFFSET(%eax)
addl $HEADER_SIZE,%eax
movl %ebx,current_break
movl %ebp,%esp
popl %ebp
ret
error:
movl $0,%eax
movl %ebp,%esp
popl %ebp
ret
## 回收 ##
## deallocate ##
.global deallocate
.type deallocate,@function
.equ ST_MEMORY_SEG,4
deallocate:
movl ST_MEMORY_SEG(%esp),%eax
subl $HEADER_SIZE,%eax
movl $AVAILABLE,HDR_AVAIL_OFFSET(%eax)
ret
- 汇编
as --32 alloc.s -o alloc.o
- 链接
ld -m elf32 alloc.o -o alloc