汇编与机器指令的相关笔记(1)
64位编程里可以使用64-bit 的地址值。但是X64 体系里只实现了48 位,高16 位要么全0,要么全1,这种形式的地址被称为 canonical 地址。其它地址为非法的。
32 位内存寻址模式支持的最复杂的寻址模式为基址变址寻址:
[base + index * scale + disp8/32]
比如如下指令:
mov eax,[eax + ecx*4 + 0x1C]
64位内存寻址模式形式和32位相同,基址和变址默认使用64位的通用寄存器。另外,64 位新增了一个RIP-Relative 寻址形式:
[rip + disp32]
这种指令的好处是便于建立PIC 代码结构(Position-Independent Code ,不依赖于位置的代码,此类代码便于建立整整的共享DLL)
内存寻址模式的使用
在16 位编程和32位编程下可以使用16 位地址模式和32 位地址模式。指令的默认地址(16位或32位)依赖于CS.D 标志位,CD.D=1时使用32 位的寻址模式,CS.L=0使用16位的寻址模式。
当改变默认的地址尺寸时,生成的机器指令会相应插入67H 这个前缀值。64 位模式下,也可以使用67 H 改变默认的64位寻址模式,改变为32 位的寻址模式。操作数寻址
寄存器寻址
内存操作数寻址
直接内存寻址
间接内存寻址–寄存器参与计算
立即数寻址
I/O 端口寻址内存地址形式
real 模式的线性地址转换规则是 segment * 16 + offset。而在64位模式下,线性地址为:
linear_address = offset ;base 强制为0
64 位模式下,除了FS 和 GS 段可以使用非0 值的base,ES,CS,DS 及SS 段的base 值强制为0.
物理地址,在分页机制下,经过处理器的分页映射管理转换为最终的物理地址,输出到address bus。符号扩展与零扩展指令
符号扩展传送指令有两大类:movsx 系列和 cbw 系列。
movsx reg,reg/mem ;16/32/64位reg,8/16 位 reg/mem
movsxd reg,reg/mem ;64位 reg,32 位 reg/mem
CBW/CWDE/CDQE
al 符号->ax;ax->eax;eax->rax
CWD/CDQ/CQO
ax->dx、ax;eax->edx、eax;rax->rdx、rax
zero-extend 零扩展 传送指令在规格上和符号扩展movsx 是一样的。
mov ax,0xb06a
movsx ebx,ax ;ebx = 0xffffb06a
movzx ebx,ax ;ebx = 0x0000b06a位操作指令
逻辑指令
and eax,0xFFFFFFF7
or eax,8
xor eax,8
xor eax,eax ;常用清零操作
位指令
bt eax,0 ;取Bit0 值到 CF
bts eax,0 ;取Bit0 值到 CF,将Bit0 置位
btr eax,0 ;取Bit0 值到 CF,将Bit0 清位
btc eax,0 ;取Bit0 值到 CF,将Bit0 取反