《Professional_Assembly_Language》学习笔记

本文介绍了汇编语言中的数据段、文本段和BSS段的概念,并详细解释了如何使用objdump工具进行反汇编,以及如何通过设置断点来进行程序调试。此外,还提供了GCC中AT&T汇编语法的基本用法,包括寄存器和立即数的表示方法。

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

汇编中常用的三种段为:
数据段,声明带有初始值的数据元素;
文本段,可执行程序声明指令码的地方;
BSS段,声明使用0或NULL值初始化的数据元素,常用作缓冲区。

BSS段中声明的数据是不包含在可执行程序中的,而数据段定义的数据必须在可执行文件中。

objdump 对目标代码文件进行一系列操作:
$objdump -d test.o   #反汇编目标文件

编译时加入调试:
$as -gstabs -o test.o test.s
$ld -o test test.o

进行调试,设置断点:
break *label+offset

调试时:
显示所有寄存器值:
info registers
显示特定寄存器或程序变量的值:
print/d //十进制 例如,print/d $eax
print/t //二进制
print/x //十六进制
显示内存特定位置的值:
x /nyz  // n表示显示的字段数,y表示输出格式(c表示字符,d表示10进制,x表示十六进制),z表示显示的字段长度(b表示字节,h表示半字,w表示字)

参数放入堆栈的顺序和printf函数获取它们的顺序是相反的。

GCC中使用AT&T汇编语法。
立即数前加 $ 符号。
寄存器前加 % 符号。

链接到C库函数的链接:
ld -dynamic-linker /lib/ld-linux.so.2 -o test -lc test.o

使用eax寄存器的32位 %eax, 16位 %ax, 8位 %al.

8个通用寄存器(EAX, EBX, ECX, EDX, EDI, ESI, EBP, ESP).

value:
    .int 33
movl value, %eax  #将value内的值传给eax寄存器
movl $value, %eax #将value地址值传给eax寄存器

movl %ebx, %edi   #将ebx内的值传给edi
movl %ebx, (%edi) #将ebx内的值传给edi内的地址位置
movl %ebx, -4(%edi) #将ebx内的值传给edi内的地址位置之前4个字节的位置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值