在64位Linux中编译32位AT&T格式的汇编程序

x86 Assembly pushl/popl don’t work with “Error: suffix or operands invalid”

32位汇编代码示例

  • 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

猜你喜欢

转载自blog.csdn.net/weixin_44395686/article/details/105879231
今日推荐