x86汇编语言学习(二)汇编指令

x86汇编语言学习(二)汇编指令

学习参考资料:《汇编语言》(第三版)清华大学出版社 王爽著

指令格式作用
movmov dest, srcdest = src
addadd dest, srcdest = dest + src
adcadc dest, srcdest = dest + src + CF
subsub dest, srcdest = dest - src
sbbsbb dest, srcdest = dest - src - CF
pushpush srcsrc入栈(改变SP后写内存)
poppop srcsrc出栈(读内存后改变SP)
pushfpushf将标志寄存器的值压栈
popfpopf从栈中弹出数据送入标志寄存器中
andand dest, srcdest = dest & src
oror dest, srcdest = dest | src
shlshl dest, 位数dest左移指定位数,位数大于1时必须放在cl中
shrshr dest, 位数dest右移指定位数,位数大于1时必须放在cl中
inin al/ax, 端口号从端口读入数据
outout 端口号, al/ax发送数据到端口
mulmul reg/内存单元乘法
divdiv reg/内存单元除法
cmpcmp dest, src比较
转移指令见下控制CPU执行指定内存的指令
串传送指令见下见下
intint 中断类型码引发中断过程
  • in & out 注意点 :

1.访问8位端口用al,访问16位端口用ax。

2.0 ~ 255以内端口号用常量。256 ~ 65535的端口号保存在dx中。

  • mul 注意点:

1.两个相乘的数位数相同,都是8位或16位。

2.8位乘数一个默认放在AL中,另一个放在8位reg或者内存字节单元中,结果放在AX中;16位乘数一个默认放在AX中,另一个放在16位reg或者内存字单元中,结果高位默认放在DX中,低位放在AX中。

  • div 注意点:

1.除数:有8位和16位两种,在一个reg或内存单元中。

2.被除数:如果除数为8位,被除数则为16位,默认放在AX中;如果除数为16位,被除数则为32位,放在DX和AX中,DX存放高16位,AX存放低16位。

3.结果:如果除数为8位,则AL存放商,AH存放余数;如果除数为16位,则AX存放商,DX存放余数。

  • cmp

cmp ax, bx 做(ax)-(bx)运算,不保存结果,仅影响flag的相关位。通常和条件转移指令一起使用。

指令含义检测的相关标志位
je等于则转移zf = 1
jne不等于则转移zf = 0
jb低于则转移cf = 1
jnb不低于则转移cf = 0
ja高于则转移cf = 0 且 zf = 0
jna不高于则转移cf = 1 且 zf = 1
  • 转移指令

1.jmp指令,无条件转移指令,可以只修改IP,也可以同时修改CS和IP。
根据位移进行转移的jmp指令:
jmp short 标号 ,(IP)=(IP)+8位位移,对IP的修改范围为-128~127。段内短转移。
jmp near ptr 标号 ,(IP)=(IP)+16位位移,对IP的修改范围为-32768~32767。段内近转移。
转移的目的地址在指令中的jmp指令:
jmp far ptr 标号 ,段间转移,会修改CS和IP。
转移地址在寄存器中的jmp指令:
jmp 16位reg ,(IP)=(16位reg)
转移地址在内存中的jmp指令:
jmp word ptr 内存单元地址(段内转移),从内存单元地址处开始存放一个字,是转移的目的偏移地址。
jmp dword ptr 内存单元地址(段间转移),从内存单元地址处开始存放两个字,高地址处的字是转移的目的段地址,低地址处是转移的目的的偏移地址。

2.jcxz指令,有条件转移指令,短转移。
jcxz 标号,功能相当于:if((cx)==0) jmp short 标号

3.loop指令,循环指令,短转移。
loop 标号,功能相当于:(cx)–; if((cx)!=0) jmp short 标号

    mov  cx, 循环次数
s:
    循环执行的程序段
    loop s

4.ret指令,用栈中数据修改IP,近转移。

(IP)=((ss)*16+(sp))
(sp)=(sp)+2

5.retf指令,用栈中数据修改CS和IP,远转移。

(IP)=((ss)*16+(sp))
(sp)=(sp)+2
(CS)=((ss)*16+(sp))
(sp)=(sp)+2

6.call指令,将当前的IP或者CS和IP压入栈中再转移。
根据位移进行转移的call指令:
call 标号,相当于:

push IP
jmp near ptr 标号

转移的目的地址在指令中的call指令:
call fat ptr 标号,相当于:

push CS
push IP //一步内完成的所以CS和IP是不变的
jmp fat ptr 标号

转移地址在寄存器中的call 指令:
call 16位reg,相当于:

push IP
jmp 16位reg

转移地址在内存中的call指令:
call word ptr 内存单元地址,相当于:

push IP
jmp word ptr 内存单元地址

call dword ptr 内存单元地址,相当于:

push CS
push IP
jmp dword ptr 内存单元地址
  • 串传送指令

1.movsb
将ds:si指向的内存单元中的字节送入es:di中,然后根据flag寄存器中df位的值,将si和di递增或递减。

2.movsw
将ds:si指向的内存单元中的字送入es:di中,然后根据flag寄存器中df位的值,将si和di递增2或递减2。

一般串传送指令和rep配合使用,cld指令将df位置0,std指令将df位置1:

mov cx, 10     ;rep循环10次
cld            ;设置df=0,正向传递
rep movsb      ;循环传送
  • int

int n 的执行过程:
1.取中断类型码n;
2.标志寄存器入栈,IF=0,TF=0;
3.CS、IP入栈;
4.(IP)=(n *4),(CS)=(n *4+2)。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值