x86汇编语言学习(二)汇编指令
学习参考资料:《汇编语言》(第三版)清华大学出版社 王爽著
| 指令 | 格式 | 作用 |
|---|---|---|
| mov | mov dest, src | dest = src |
| add | add dest, src | dest = dest + src |
| adc | adc dest, src | dest = dest + src + CF |
| sub | sub dest, src | dest = dest - src |
| sbb | sbb dest, src | dest = dest - src - CF |
| push | push src | src入栈(改变SP后写内存) |
| pop | pop src | src出栈(读内存后改变SP) |
| pushf | pushf | 将标志寄存器的值压栈 |
| popf | popf | 从栈中弹出数据送入标志寄存器中 |
| and | and dest, src | dest = dest & src |
| or | or dest, src | dest = dest | src |
| shl | shl dest, 位数 | dest左移指定位数,位数大于1时必须放在cl中 |
| shr | shr dest, 位数 | dest右移指定位数,位数大于1时必须放在cl中 |
| in | in al/ax, 端口号 | 从端口读入数据 |
| out | out 端口号, al/ax | 发送数据到端口 |
| mul | mul reg/内存单元 | 乘法 |
| div | div reg/内存单元 | 除法 |
| cmp | cmp dest, src | 比较 |
| 转移指令 | 见下 | 控制CPU执行指定内存的指令 |
| 串传送指令 | 见下 | 见下 |
| int | int 中断类型码 | 引发中断过程 |
-
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)。
汇编指令&spm=1001.2101.3001.5002&articleId=99650384&d=1&t=3&u=a11b8ccd6e9b4ef3b8140b2c11a4e929)
1万+

被折叠的 条评论
为什么被折叠?



