汇编语言程序设计读书笔记(GAS版)

IA-32平台的寄存器:

寄存器描述
通用8个32位寄存器,用于存储正在处理的数据
6个16位寄存器,用于处理内存访问
指令指针单一的32位寄存器,指向要执行的下一条指令码
浮点数据8个80位寄存器,用于浮点数学数据
控制5个32位寄存器,用于确定处理器的操作模式
调试8个32位寄存器,用于在调试处理器时包含信息

IA-32平台的通用寄存器(32位):

寄存器描述
EAX用于操作数和结果数据的累加器
EBX指向数据内存段中的数据的指针
ECX字符串和循环操作的计数器
EDXI/O指针
EDI用于字符串操作的目标的数据指针
ESI用于字符串操作的源的数据指针
ESP堆栈指针
EBP堆栈数据指针

IA-32平台的段寄存器(16位):

段寄存器描述
CS代码段
DS数据段
SS堆栈段
ES附加段指针
FS附加段指针
GS附加段指针

IA-32平台的控制寄存器:

控制寄存器描述
CR0控制操作模式和处理器状态的系统标志
CR1当前没有使用
CR2内存页面错误信息
CR3内存页面目录信息
CR4支持处理器特性和说明处理器特性能力的标志

IA-32平台的状态标志:

标志名称
CF0进位标志
PF2奇偶检验标志
AF4辅助进位标志
ZF6零标志
SF7符号标志
OF11溢出标志

IA-32平台的系统标志:

标志名称
TF8陷阱标志
IF9中断使能标志
IOPL12和13I/O特权级别标志
NT14嵌套任务标志
RF16恢复标志
VM17虚拟8086模式标志
AC18对准检查标志
VIF19虚拟中断标志
VIP20虚拟中断挂起标志
ID21识别标志

IA-32平台的FPU寄存器:

FPU寄存器描述
数据寄存器用于浮点数据的8个80位寄存器
状态寄存器报告FPU状态的16位寄存器
控制寄存器控制FPU精度的16位寄存器
标记寄存器描述8个数据寄存器的内容的16位寄存器
FIP寄存器指向下一条FPU指令的48位FPU指令指针
FDP寄存器指向内存中的数据的48位FPU数据指针
操作码寄存器保存FPU处理的最后指令的11位寄存器

binutils包安装的所有程序见书34页。

as汇编器的命令行参数见书35页。

ld连接器的命令行参数见书38页。

gcc编译器的命令行参数见书40页。

gdb调试器的命令行参数见书43页。

objdump的命令行参数见书47页。

gprof简档器的命令行参数见书49页。

cpuid指令可用的不同输出选项见书57页。

gdb调试器的常用命令见书64页:

数据命令描述
info registers显示所有寄存器的值
print显示特定寄存器或者来自程序的变量的值
x显示特定内存位置的内容

IA-32平台的数据声明伪指令:

命令数据类型
.ascii文本字符串
.asciz以空字符结尾的文本字符串
.byte字节值
.double双精度浮点数
.float单精度浮点数
.int32位整数
.long32位整数(和.int相同)
.octa128位整数
.quad64位整数
.short16位整数
.single单精度浮点数(和.float相同)

定义静态符号:

.equ factor, 3

.equ LINUX_SYS_CALL, 0x80

bss段定义数据元素命令见书73页:

命令描述
.comm声明未初始化的数据的通用内存区域
.lcomm声明未初始化的数据的本地通用内存区域

.fill 10000命令使汇编器自动地创建10000个数据元素。

mov指令有非常特殊94的规则,只有某些位置可以传送给其他位置,mov指令的源和目标操作数组合见书76页。

mov指令的源寄存器宽度和目标寄存器宽度必须相同。

记住在平坦内存模型中,所有内存地址都是使用32位数字表示的。

EFLAGS寄存器的作用:

ELFAGS位名称描述
CF进位(Carry)标志数学表达式产生了进位或者借位
OF溢出(Overflow)标志整数值过大或者过小
PF奇偶校验(Parity)标志寄存器包含数学操作造成的错误数据
SF符号(Sign)标志指出结果为正还是负
ZF零(Zero)标志数学操作的结果为零

无符号条件传送指令和有符号条件传送指令列表见书84页。

指令描述
XCHG在两个寄存器或者寄存器和内存位置之间交换值
BSWAP反转一个32位寄存器中的字节顺序
XADD交换两个值并且把总和存储在目标操作数中
CMPXCHG把一个值和一个外部值进行比较,并且交换它和另一个值
CMPXCHG8B比较两个64位值并且交换它们

使用xchg对内存位置进行操作时要小心。lock处理是非常耗费时间的,并且可能对程序性能有不良影响。

附加的PUSH和POP指令:

指令描述
PUSHA/POPA压入或者弹出所有16位通用寄存器
PUSHAD/POPAD压入或者弹出所有32位通用寄存器
PUSHF/POPF压入或者弹出EFLAGS寄存器的低16位
PUSHFD/POPFD压入或者弹出EFLAGS寄存器的全部32位

POPF和POPFD指令的行为因处理器的操作模式而不同。当处理器运行在保护模式下的ring0(特权模式)下时,EFLAGS寄存器中的所有非保留标志都可以被修改,除VIP、VIF和VM标志之外。VIP和VIF标志被清零,VM标志不会被修改。

当处理器运行在保护模式的更高级别的ring(非特权模式)下时,会得到和ring0模式下的相同结果,并且不允许修改IOFL字段。

PUSH和POP不是把数据压入和弹出堆栈的唯一途径。也可以通过使用ESP寄存器作为内存指针,手工地把数据存放到堆栈中。

通常,会看到很多程序把ESP寄存器的值复制到EBP寄存器,而不是使用ESP寄存器本身。在汇编语言函数中经常使用EBP指针指向函数的工作堆栈空间的基址。访问存储在堆栈中的参数的指令相对于EBP值引用这些参数。

条件跳转指令列表见书107页。

条件跳转指令不支持分段内存模式下的远跳转。如果在分段内存模式下进行程序设计,就必须使用程序设计逻辑确定条件是否存在,然后实现无条件跳转转移到另一个段中的指令。

专门修改进位标志的指令(见书112页):

指令描述
CLC清空进位标志(设置它为零)
CMC对进位标志求反(把它改变为相反的值)
STC设置进位标志(设置它为1)

循环指令(见书112页):

指令描述
LOOP循环直到ECX寄存器为零
LOOPE/LOOPZ循环直到ECX寄存器为零,或者没有设置ZF标志
LOOPNE/LOOPNZ循环直到ECX寄存器为零,或者设置了ZF标志

MMX寄存器被映射到FPU寄存器,所以使用MMX寄存器时要小心。记住,在使用任何MMX寄存器指令之前,都要把FPU寄存器中存储的所有数据保存到内存中。

 

转载于:https://my.oschina.net/u/943779/blog/1861812

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值