ATT格式汇编语言

这篇博客介绍了ATT格式的汇编语言,包括如何使用as和gcc编译链接,调试技巧,定义数据如ASCII字符串、整数和浮点数,以及BSS和DATA段的作用。还讲解了nop空指令,cpuid指令的使用,Linux系统调用如int 0x80,并展示了如何通过指针操作内存。最后提到了使用C库函数的可能性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.编译与链接

方法一:使用as

#as -o test.o test.s

#ld -o test test.o

方法二:使用gcc

#gcc -o test test.s

gnu连接器查找_start标签以确定程序的开始,但gcc查找main标签,所以使用gcc要把 _start改为main

2.调试

#as -gstabs -o test.o test.s

#ld -o test test.o

参考:GDB调试--以汇编语言为例

3.定义数据

数据段

使用.data命令声明 标签+命令

.ascii 文本字符串

.asciz 以空字符结尾的文本字符串

.int 32位整数 .short 16位整数

.float 单精度浮点数 .double 双精度浮点数

.quad 8字节整数

例如:

.section .data
output:
.ascii "This is a string"
height:
.int 78
length:
.int 34,79,90

静态符号

equ命令用于把常量值设置为可以在文本段中使用的符号

例如:

.equ linux_sys_call ,0x80

使用静态数据要加$

movl $linux_sys_call ,%eax

BSS段

.comm 声明未初始化的数据的通用内存区域

.lcomm 声明未初始化的数据的本地通用内存区域(为不会从本地汇编代码之外进行访问的数据保留的)

例如:

.section .bss

.lcomm buffer ,1000

把 1000字节的内存区域赋值给buffer标签

一个程序本质上都是由 bss段、data段、text段三个组成的

在采用段式内存管理的架构中(比如intel的80x86系统),bss段(Block Started by Symbol segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域,一般在初始化时bss 段部分将会清零。bss段属于静态内存分配,即程序一开始就将其清零了。

比如,在C语言之类的程序编译完成之后,已初始化的全局变量保存在.data 段中,未初始化的全局变量保存在.bss 段中。

参考:关于text段、data段和bss段以及堆栈

3.nop

空指令即空操作

4.cpuid

cpuid指令运行之后,分散在3个寄存器ebx,edx,ecx

(gdb) p/c $bx
$18 = 71 'G'
(gdb) p/c $bl
$19 = 71 'G'
(gdb) p/c $bh
$20 = 101 'e'
(gdb) p/c $cl
$21 = 110 'n'
(gdb) p/c $ch
$22 = 116 't'
(gdb) p/c $ecx
$23 = 110 'n'
(gdb) p/c $dh
$24 = 110 'n'
(gdb) p/c $dl
$25 = 105 'i'

5.linux系统调用

movl $1, %eax
movl $0, %ebx
int $0x80;从linux内核访问控制台显示,使用int生成软中断,linux内核提供

参考:汇编语言Linux系统调用

6.指针

.section .data
output:
.ascii "The processor Vendor ID is 'xxxxxxxxxxxx'\n"
.section .text
.globl _start
_start:
movl $0, %eax
cpuid
movl $output, %edi ;output标签的内存位置加载到edi寄存器中
movl %ebx, 28(%edi);ebx寄存器中的内容按照edi指针放到内存的指定位置。括号外的数字表示相对于output标签放置数据的位置,这个数字和edi寄存器中的地址相加
movl %edx, 32(%edi)
movl %ecx, 36(%edi)

The processor Vendor ID is 'GenuineIntel'

7.使用C库函数

printf

--《未完》--

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值