目录
一、程序执行
- 条件码是CPU根据运算结果由硬件设置的位,体现当前指令执行结果的各种状态信息,是程序分支和程序循环的依据
反汇编:
- objdump -d code.o
- gdb p disassemble sum x/11xb sum 查看从sum函数地址开始的11个字节
二、数据类型
1.IA32支持的数据类型和格式:
- long double实际长度为80位,但分配96位=12B(按4B对齐)
基本操作:
- 运算类指令:对寄存器或内存数据操作
- 传送类指令:数据:寄存器<=>内存
- 控制类指令:分支/循环,有/无条件跳转
2.IA32的寄存器组织:
• 6个条件标志
– OF、SF、ZF、CF各是什么标志(条件码)? 溢出、符号、零、进位/借位
– AF:辅助进位标志(BCD码运算时才有意义)
– PF:奇偶标志
•
3个控制标志
– DF(Direction Flag):方向标志(自动变址方向是增还是减)
– IF(Interrupt Flag):中断允许标志 (仅对外部可屏蔽中断有用)
– TF(Trap Flag):陷阱标志(是否是单步跟踪状态)
3.计算机中的算盘就是加法器:
重要认识1:计算机中所有运算都基于加法器实现!
重要认识2:加法器不知道所运算的是带 符号数还是无符号数。
重要认识3:加法器不判定对错,总是取低n位作为结果,并生成标志信息。
三、访问信息
1.寻址方式:
操作数类型:①立即数$0x400 ②寄存器 %eax ③内存地址(%eax)
类型:
lea 寻址:
leal (%eax,%eax,2), %eax
2.操作指令
数据传送指令
操作数:第一个是源,第二个是目的。
IA32的限制:
- 传送指令两个操作数不能同时指向存储器位置
- 将一个值从存储器一个位置复制到另一个位置:①源值加载到寄存器 ②寄存器写入目的位置
算术逻辑指令:
①加载有效地址:lea
- 可以为后面的存储器引用产生指针,将有效地址写人到目的操作数。
- 以简洁地描述普通的算术操作.
②一元操作和二元操作
- 一元:既是源又是目的,可以是一 个寄存器,也可以是一个存储器位置
- 二元:第二个操作数既是源又是目的。第一个操作数可以是立即数、寄存器或是存储器位置。第二个操作数可以是寄存器或是存储器位置。两个操作数不能同时是存储器位置。
③移位操作
- 移位量+要移位的数
-
移位量可以是一个立即数,或者放在单字节寄存器元素 %cl 中
-
SAR算术右移 SHR逻辑右移(补前置0)
④特殊的算术操作
- imull 指令称为“双操作数”乘法指令,可以用于两个不同的乘法操作。
- 无符号数乘法 (mull), 补码乘法(imull) 。这两条指令都要求一个参数必须在寄存器%eax 中,而另一个作为指令的源操作数给 出
- 乘积存放在寄存器%edx (高 32 位)和%eax (低 32 位)中。
- idivl 有符号除法指令将寄存器 %edx (高 32 位)和 %eax (低32 位)中的 64 位数作为被除数,而除数作为指令的操作数给出。指令将商存储在寄存器 %eax 中,将余数存储在寄存器 %edx 中。
- cltd 指令将 %eax 符号扩展到 %edx 。