ComputerSystems
大约 2 分钟
ComputerSystems
目录
汇编数据类型
数据指定
汇编数据格式(位宽修饰符)
Inter术语字(word)
表示16位数据类型(从16位体系结构扩展而来的原因),字不等于字长 一般不用字长正概念,高级语言中常用字节表示数据大小、汇编语言中常用字表示数据大小
- 32位1字长=2字=4B,1字=2字节
- 64位1字长=4字=8B,1字=2字节
C语言数据类型与汇编位宽修饰符的关系:(x86-64,64位机器中,指针长:4字 = 1个字长 = 2^64bit = 64位 = 8字节)
C声明 | 汇编代码后缀 /位宽修饰符 | 后缀含义(double作l) | Intel数据类型 | 字节大小 |
---|---|---|---|---|
char | b | byte | 字节 | 1 |
short | w | word | 字 | 2 |
int | l | double words | 双字 | 4 |
long | q | quad words | 四字 | 8 |
char * | q | quad words | 四字 | 8 |
float | s | single ... | 单精度 | 4 |
double | l | double ... | 双精度 | 8 |
表附:
- int和double后缀都是
l
但字节大小不同:但不产生歧义,浮点数会使用一组完全不同的指令和寄存器- 使用立即数时需要加位宽修饰符且长度应该匹配 (否则warning)
- 以寄存器为目的时不需要加修饰符因为寄存器宽度固定 (8086寄存器不拆开时是16位)
操作数指示符
reg ;register 寄存器 跟8/16
mem ;memory 内存 跟8/16
imm ;immediate 立即数 跟8/16
操作数格式(Mb为简便省去下标b,比例因子s必须是1/2/4/8)
类型 | 格式 | 操作数值 | 寻址模式名称 | 举例 |
---|---|---|---|---|
立即数(immediate) | $Imm | Imm | 立即数寻址 | mov ax, 0xb800 |
寄存器(register) | ra | R[ra] | 寄存器寻址 | |
存储器 | Imm | M[Imm] | 绝对寻址 | |
存储器 | (ra) | M[R[ra]] | 间接寻址 | mov bl, [ds:si] |
存储器 | Imm(rb) | M[Imm+R[rb]] | (基址+偏移量)寻址 | |
存储器 | (rb, ri) | M[R[rb]+R[ri]] | 变址寻址 | |
存储器 | Imm(rb, ri) | M[Imm+R[rb]+R[ri]] | 变址寻址 | |
存储器 | Imm(, ri, s) | M[R[ri] · s] | 比例变址寻址 | |
存储器 | Imm | M[Imm+R[ri] · s] | 比例变址寻址 | |
存储器 | (rb, ri, s) | M[R[rb]+R[ri] · s] | 比例变址寻址 | |
存储器 | Imm(rb, ri, s) | M[Imm+R[rb]+R[ri] · s] | 比例变址寻址 |
根据操作数的可能性分三种类型:立即数、寄存器、内存引用(其他内存引用都是表中最后一行的特殊情况,只用记最后一行就行了!)