标题:汇编指令期末复习
上课没认真,花了一天的时间,把书看了,把主要的指令写了下来,希望对大家和我自己期末都有帮助。
判断奇偶:思路很简单,输入一个数,然后将这个数与01H作AND运算,结果为1为奇数,结果为0是偶数。
Mov 数据转移指令,不能对cs赋值,用立即数给内存单元赋值需要ptr声明
Push 数据入栈,只能是16或者32位数
Pop 数据出栈,也只能是16位或者32位数
XCHG交换通用寄存器数值
XLAT 创建一个表,把表的地址给bx,查询的序号给al,再直接XLAT+表名即可查表
LEA 相当于取地址符号,但是只能对16位进行操作
LDS 远地址求址,目的地址只能是通用寄存器,高16位段地址到段寄存器ds中,低16位为偏移地址到通用寄存器Ax
IN/OUT输入/输出指令,n<255时,直接从端口中读取一个字节储存在AL或者AX中,当n>255时,要采用媒介通用寄存器DX间接寻址,传到AX中
ADD 加法
ADC 带着标志位的加法,常常用于多字节的加法(即相加的时候还要加上进位标志)
INC 目的操作数增加1,不影响标志位,对其他标志都有影响
AAA 加法BCD校验
SUB 减法
SBB 带符号的减法(上同)
CMP 用于比较两个操作数,相减不改变结果只改变标志
NEG 对目的操作数求补(相当于用0-这个数)
AAS 减法BCD校验
DAS 有自动功能的BCD校验
MUL 无符号乘法(8或者16位),当8位相乘时,存储到AX中,如果AH!=0,CF,OF置1;当16位时,高16放在DX中,低16位放在AX中(上同)
IMUL 有符号乘法(上同)
AAM 乘法BCD校验
DIV 8位时,商放AL,余数放在AH
IDIV 16位时,商放在AX,余数在DX
AAD 除法BCD校验
CBW 字节转化为字,不改变标志位
AND 逻辑与
TEST 逻辑与,只改变标志位
XOR 异或运算
NOT 非运算
SHL、SAL: 每位左移, 低位补 0, 高位进 CF
SHR : 每位右移, 低位进 CF, 高位补 0
SAR : 每位右移, 低位进 CF, 高位不变
区别:
1,两者的区别在于SAR右移时保留操作数的符号,即用符号位来补足,而SHR右移时总是用0来补足。
2,有符号数右移编译器会使用算术右移,无符号数右移编译器会使用逻辑右移
ROL 循环左移指令
ROR 循环右移指令
RCL 带进位的循环左移(进位标志移动到最低位)
RCR 带进位的循环右移(进位标志移动到最高位)
这四条指令,当循环次数等于1时,只有操作数最高位和进位标志相等是为0;当大于1时
不影响标志位。
字符串操作类:df=0 每次操作后si,di递增
df=1 递减
共同点
指令默认的源地址的字符串在DS中,偏移在SI
目的地址的字符串在ES中,偏移量是DI
MOVS 能将源串中的字,字节,双字传递到目的串中指针DI所指的存储单元中,并修改相应的SI,DI。使其指向串中下一数据单元,不影响标志寄存器。
LODS 能把源串中指针SI所指向的字节,字,双字,传递到寄存器AL,AX中,并修改相应的SI,使其指向串中下一数据单元,不影响标志寄存器。
STOS 能把寄存器AX,AL的中的数据,传递到目的地址中DI所指向的字节或字,并修改相应的DI,使其指向串中下一数据单元,不影响标志寄存器。
CMPS 用于比较两个字符串的长度是否相等,直接相减,不改变结果只改变标志位。
SCAS 用于比较AX中的东西和目的字符串的大小,对标志寄存器有影响,常用来搜索目的字符串中是否含有某个元素。
JMP 无条件转移指令,不改变标志寄存器,分为直接转移(段内(短程(偏移量是一个字节)(-128~127)和近程(偏移量是一个字)(在不同的情况下分为16和32两部分,为正负2的n-1次方(类似上方)))和段外)和间接转移(寄存器或者储存器)。
条件转移指令:
A大于 B小于 E相等 G大(有符号) L小(无符号) N非 Z -ZF C-CF P-PF E偶数 O -OF O奇数 S-SF
循环指令:
LOOP 先让CX的值减去1,CX不为0就跳转
REP (上同)(只对串操作有效)
CALL (用法同JMP),回调指令
REP n;//改指令用来,将参数出栈并且丢弃
标志操作指令(0 1 反)
CF:CLC STC CMC
DF: CLD STD
IF: CLI STI
其他处理器控制指令
NOP,HLT,WAIT,ESC,LOCK
ROL 循环左移指令
ROR 循环右移指令
RCL 带进位的循环左移(进位标志移动到最低位)
RCR 带进位的循环右移(进位标志移动到最高位)
这四条指令,当循环次数等于1时,只有操作数最高位和进位标志相等是为0;当大于1时
不影响标志位。
字符串操作类:df=0 每次操作后si,di递增
df=1 递减
共同点
指令默认的源地址的字符串在DS中,偏移在SI
目的地址的字符串在ES中,偏移量是DI
MOVS 能将源串中的字,字节,双字传递到目的串中指针DI所指的存储单元中,并修改相应的SI,DI。使其指向串中下一数据单元,不影响标志寄存器。
LODS 能把源串中指针SI所指向的字节,字,双字,传递到寄存器AL,AX中,并修改相应的SI,使其指向串中下一数据单元,不影响标志寄存器。
STOS 能把寄存器AX,AL的中的数据,传递到目的地址中DI所指向的字节或字,并修改相应的DI,使其指向串中下一数据单元,不影响标志寄存器。
CMPS 用于比较两个字符串的长度是否相等,直接相减,不改变结果只改变标志位。
SCAS 用于比较AX中的东西和目的字符串的大小,对标志寄存器有影响,常用来搜索目的字符串中是否含有某个元素。
JMP 无条件转移指令,不改变标志寄存器,分为直接转移(段内(短程(偏移量是一个字节)(-128~127)和近程(偏移量是一个字)(在不同的情况下分为16和32两部分,为正负2的n-1次方(类似上方)))和段外)和间接转移(寄存器或者储存器)。
条件转移指令:
A大于 B小于 E相等 G大(有符号) L小(无符号) N非 Z -ZF C-CF P-PF E偶数 O -OF O奇数 S-SF
循环指令:
LOOP 先让CX的值减去1,CX不为0就跳转
REP (上同)(只对串操作有效)
CALL (用法同JMP),回调指令
REP n;//改指令用来,将参数出栈并且丢弃
标志操作指令(0 1 反)
CF:CLC STC CMC
DF: CLD STD
IF: CLI STI
其他处理器控制指令
NOP,HLT,WAIT,ESC,LOCK