@2017libin
2019-06-28T05:57:18.000000Z
字数 3167
阅读 103
汇编使用mov指令时,imm->mem时,mem必须显示表示类型。
mov word ptr [1200h],255;指明为word类型
指令格式:
xchg reg,reg/mem
指令格式:
xlat ;[al + bx] -> al
堆栈区域的段地址放在ss中,偏移地址由sp来控制。堆栈操作只有两种指令,push 和 pop
push r16/m16/seg ;sp-2 -> sp, r16/m16/seg -> ss:[sp]
pop r16/m16/seg ; r16/m16/seg -> ss:[sp], sp+2 -> sp
注意这里的指针移动,说明了一开始指针是为高地址的,这时候相当于一个倒放的桶,其中出口为低位,桶底为高位。
clc ;复位进位标志,0 -> cf
stc ;置位进位标志,1 -> cf
cmc ;求反进位标志,-cf -> cf
cld ;复位方向标志,0 -> df,串操作后地址增大
std ;置位方向标志,1 -> df,串操作后地址减少
cli ;复位中断标志,0 -> if,禁止可屏蔽中断
sti ;置位中断标志,1 ->if,允许可屏蔽中断
lea r16,mem ;mem的有效地址-> r16
mov di, offset warv ;warv的有效地址 -> di ;这里的有效地址相当于偏移地址
双操作数加减法指令格式:
运算指令助记符 reg,imm/reg/mem
运算指令助记符 mem,imm/reg
add dest,src ;dest+src -> dest
adc dest,src ;dest+src+cf -> dest
sub dest,src ;dest-src -> dest
sbb dest,src ;dest-src-cf -> dest
cmp dest,src ;dest-src,但是结果不送回dest,影响标志位
指令格式
inc reg/mem ;自增
dec reg/mem ; 自减
对状态标志位的影响:不影响cf,影响其余标志位
指令格式:
neg reg/mem ;0-reg/mem -> reg/mem
指令格式
cbw ;字节转换为字,al符号扩展为ax,如果al最高符号位为1,则ah = 11h,否则ah = 00h。
cwd ;字转换为双字,ax符号扩展为dx,如果ax最高位符号位为1,则dx = 1111h,否则dx = 0000h。
指令格式
mul r8/m8 ;无符号字节乘法,al*r8/m8 -> ax
mul r16/m6;无符号字乘法,ax*r16/m16 -> dx.ax
imul r8/m8;有符号字节乘法
imul r16/m16;有符号字乘法
指令格式
div r8/m8 ;无符号字节除法,ax÷r8/m8的商 -> al,ax÷r8/m8的余数 -> ah
div r16,m16 ;无符号字除法,dx.ax÷r16/m16的商 -> ax,dx.ax÷r16/m16的余数 -> dx
idiv r8/m8 ;有符号字节除法,余数符号和被除数符号相同,也就数dx.ax的符号
idiv r16/m16 ;有符号字除法,同上
对状态标志位的影响:没有定义,但是可能溢出!当除数为0或者商超过范围时,溢出!
指令格式
and dest,src ;逻辑与指令
or dest,src ;逻辑或指令
xor dest,src ;逻辑异或指令
test dest,src ;测试指令,dest^src
not reg/mem ;逻辑非指令
and,or,xor,test支持的格式与双符号位的加减法一样
指令格式
shl reg/mem,1/cl ;逻辑左移,reg/mem左移1/cl位,最低位补零,最高位进入cf。
shr reg/mem,1/cl ;逻辑右移,reg/mem右移1/cl位,最高位补零,最低位进入cf。
sal reg/mem,1/cl ;算数左移,reg/mem左移1/cl位,最低位补零,最高位进入cf。
sar reg/mem,1/cl ;算数右移,reg/mem右移1/cl位,最高位不变(**其实也就是最高位补符号位**),最低位进入cf。
指令格式
rol reg/mem,1/cl ;不带进位的循环左移
ror reg/mem,1/cl ;不带进位的循环右移
rcl reg/mem,1/cl ;带进位的循环左移
rcr reg/mem,1/cl ;带进位的循环右移
指令格式
jmp label ;段内转移,label处偏移地址->ip
jmp r16/m16 ;段内转移,r16/m16->ip
jmp far ptr label ;段间转移,label所在cs->cs,label所在的ip->ip
jmp far ptr mem ;段间转移,[mem]->ip,[mem+2]->cs
jmp能够根据能够根据标号的位置自动生成短转移,近转移,远转移。当无法明确或者强制更改时,必须用ptr来明确。
指令格式
jcc label ;条件满足,发生转移:ip+8位位移量->ip
jcc只能实现段内-128~127个单元范围的转移。其中cc只是表示利用标志来判断的条件。,共有16种。
;无符号数比较大小Below(低),Above(高)JB ;低于BelowJNB ;不低于No BelowJBE ;低于等于;有符号数比较大小Greater(大),Less(小)JL ;小于LessJNL ;不小于No LessJNLE ;不小于等于(大于)
JZ ;等于0JE ;相等,相当于等于零JO ;溢出JC ;有进位跳转
| 功能号 | 功能 | 入口参数 | 出口参数 |
|---|---|---|---|
| AH=01H | 从标准设备输入一个字符 | AL=输入字符的ASCLL | |
| AH=02H | 从标准设备输出一个字符 | DL=欲显示字符的ASCLL | |
| AH=09H | 从标准设备输出一个字符串 | DS:DX=欲显示字符串($结尾) | |
| AH=0AH | 从标准设备输入一个字符串 | DS:DX=输入字符串将在缓冲区中的首地址 | |
| AH=0BH | 判断标准输入设备有无输入 | AL=0,没有收入;AL=0FFH,有收入 | |
| AH=25H | 中断服务子程序入口地址设置 | AL=中断向量号,DS:DX=中断服务程序入口地址 | |
| AH=35H | 获取中断服务程序入口地址 | AL=中断向量号 | ES:BX=中断服务子程序入口地址 |