mov 指令
mov 指令用于数据传送。
mov 目的操作数 , 源操作数据
mov 寄存器/内存 , 寄存器/内存/立即数
⚠️ 不支持的MOV操作:
1、Intel 的处理器不允许将一个立即数传送到段寄存器;
mov ds,0x99 ; //不允许
;// 正确的做法
mov ax,0x99
mov ds,ax
2、不能使用mov修改 IP
寄存器值;
mov ip,0x99 ; //错误
3、不允许在两个内存单元之间直接进行传送操作;
mov [0xb800],[0xb801] ; //不允许
4、目的操作数 和 源操作数据的数据宽度必须相同;
mov ds,al ; //不允许
mov bx,al ; //不允许
mov al,bx ; //不允许
指令的目的操作数或源操作使用了寄存器,编译器就可以判断传输数据的位数,否则需要显式指定:
mov [0xb800],0x99 ; // 不允许,因为无法判断数据长度,0x99可能是0x0099/0x0000099
mov byte [0xb800],0x99 ; // 告诉编译器 0x99 是 0x99
mov word [0xb800],0x99 ; // 告诉编译器 0x99 是 0x0099
mov dword [0xb800],0x99 ; // 告诉编译器 0x99 是 0x00000099
jmp 指令
转移指令-jmp(跳转指令)实现方式
|-修改ip
|-同时修改cs和ip
相对 - 修改ip值:ip = ip + 地址差值(目标地址 - jmp下条指令的地址)
绝对 - 替换ip值:ip = 值
短 - 段内
近 - 段内
远 - 段间
间接 - 不是立即数(内存/寄存器)
直接 - 是立即数
8086处理器的无条件转移指令
|-"相对"
|-1、jmp short 目标地址 ;//"相对"短转移,机器码:EB 一个字节地址差值
|-2、jmp near 目标地址 ;//"相对"近转移,机器码:E9 两个字节地址差值
|-3、jmp 目标地址 ;
|-"绝对"
|-"间接"
|-3、间接绝对近转移 jmp r/m
|-4、间接绝对远转移 jmp far m
|-"直接"
|-5、直接绝对远转移 jmp 16位段地址:16位偏移地址
1、"相对"短转移
jmp short 目标地址 ;机器码:EB 一个字节地址差值
段内转移范围为1个字节有符号数的取值范围:-128 ~ 127
2、"相对"近转移
jmp near 目标地址 ;机器码:E9 两个字节地址差值
段内转移范围为2个字节有符号数的取值范围:-32768~ 32767
3、绝对间接近转移
jmp r/m
例:
jmp cx ;修改ip的值为cx的值
jmp [0x3000] ;修改ip的值为内存[cs:0x3000]处的值(取两个字节)
jmp [bx] ;修改ip的值为内存[cs:bx]处的值(取两个字节),如果bx内容为0x3000,则等同于上一条指令
4、绝对间接远转移
jmp far m
例:
jmp far [0x2002] ;jmp 0x2004:0x2002
jmp far [bx] ;jmp bx+2:bx
5、绝对直接远转移
jmp 16位段地址:16位偏移地址
例:
jmp 0x052e:0x003c