x86汇编

时间:2023-03-10 02:33:52
x86汇编

● 实模式下32bit处理器,与8086兼容,例如loop 指令结束标志,只判断cx,而不是ecx

● IO端口

实际上是一些寄存器,在IO接口当中。向外设读写数据,要通过读写IO端口来实现。

有些计算机系统中,端口会映射到内存地址空间。

有些计算机系统,端口独立编址,处理器的地址线连接到IO接口

独立编址的端口不能用mov指令访问,要用in/out

in al, dx ;只能用al/ax, dx

in ax, dx

in al, 0xf0; 如果源操作数使用立即数,只能是一个字节

in ax, 0xf0;

out 与in类似

● intel 处理器段地址必须最少16字节对齐

● 8086寻址方式

1. 寄存器寻址,数据在寄存器里:mov ax, bx

2. 立即寻址:mov ax, 0x02; mov bx, label1

3. 内存寻址,确定偏移地址(因为段地址由段寄存器确定),即有效地址EA。物理地址=段寄存器地址左移4位+EA

3.1 直接寻址,用中括号括起

mov ax, [0x7c00]

add word [0xef05], 0x1234

xor byte [es:label1], 0x51

3.2 基址寻址和变址寻址

两者几乎一样,只是基址寻址用基址寄存器bx,bp作为有效地址,变址寻址用变址寄存器si,di作为有效地址

用bp时,默认段寄存器为ss,其他默认为ds

string dw 'abcdefgh'

mov bx, string

mov ax, [bx] ;基址寻址

mov [si], dx ;变址寻址

3.3 基址变址寻址

用基址寄存器和变址寄存器同时确定EA

mov word [bx+si], 0x1234;

add ax, [bx+di]

● 栈的实质是一段内存空间,由ss:sp确定,当使用push,pop指令的时候,处理器自动将sp+2,或-2。实际上,可以用这样的指令来代替push、pop:

sub sp, 2

mov bx, sp

mov [ss:bx], 10

如果用寄存器来提供偏移地址,只能用bx,si,di,bp,其他不行,例如,mov [ax], dl;错误。mov [bx], dl;正确

cbw ;将字节扩展到字,操作数在al中
cwd ;将字扩展到双字,ax->dx:ax

neg al; 求相反数,相当于0-al
jcxz; cx为0时跳转

loop指令依赖于cx的值,每执行一次,cx减一,当cx=0时,跳出循环

movsb,movsw,movsd ;ds:si->es:di
rep指令依赖于cx的值