文章目录
-
汇编伪操作是给编译器提供某些必要的信息,以帮助编译器正确完成程序的编译
-
也就是说,这些伪操作只在汇编过程中起作用,汇编结束,伪操作也就消失了
-
伪操作比较好认: 大部分都是以'.'开头
段定义伪操作
z80
.text 告诉编译器后续内容放入代码段
.data 告诉编译器后续内容放入数据段
.bss 告诉编译器后续内容放入BSS段
指令集类型标识伪操作
z80
.arm
.code 32 后续指令汇编为32bit的机器指令
.thumb
.code 16 后续指令汇编为16bit的机器指令
数据定义伪操作
z80
.byte 20 分配一字节空间存储数字20
.short 0x11ff 分配两字节空间存储0x11ff
.word 0x22222222 分配4字节空间存储0x22222222 效果等同于.int
.space 1024 分配1024字节内存空间 初始化为0
.string "abcdef" 分配7个字节空间存储"abcdef" + \0, 等价于.asciz
.ascii "abcdef" 分配6个字节空间存储"abcdef"
符号声明伪操作
z80
.global _start 将一个符号声明为全局的,这样其它模块可以引用该符号 等价与.globl
.extern _start 将一个符号声明为外部定义的
汇编控制伪操作
- 等价于c中的#if 0
z80
.if 0
add r0, r1,r2
.else
sub r0, r1, r2
.endif
常量定义伪操作
z80
.equ MAX, 100
宏定义伪操作
z80
@.macro 宏名称,参数1, 参数2
.macro swap, x, y
eor \x, \x,\y
eor \y, \x,\y
eor \x, \x,\y
.endm @宏定义结束
mov r0, #100
mov r1, #200
swap r0, r1 @使用宏
标号的声明
z80
.global 将一个符号声明为全局的
.extern 将一个符号声明为外部的
- 练习:汇编编程实现strcmp的逻辑
z80
.text
.global _start
_start:
ldr r0, =str1
ldr r1, =str2
loop:
ldrb r2, [r0], #1
ldrb r3, [r1], #1
cmp r2, #0
beq cmp_end
cmp r2, r3
beq loop
cmp_end:
sub r0, r2, r3
b .
str1:
.string "abcf"
str2:
.string "abcd"
.end