关于8086的一些笔记
串操作指令的共同特点:
1.源串默认为数据段DS,允许段超越为SS,ES:偏移地址在SI中;
2.目的串默认为在ES段中,偏移地址在DI中;
3.使用重复前缀时,串长度在CX寄存器中;
4.地址指针和计数器自动修改。
使用串操作指令之前,应预先设置源串指针DS:SI(这里的实际意思是让地址指针SI指向DS(数据段)),目的串指针ES:DI,重复次数CX,方向标志位DF;
串传送指令
串传送指令格式: MOVS OPRD1,OPRD2
MOVSB (源操作数为SI指定的地址的数据)
MOVSW (目的操作数为DI指定地址的数据)
功能:将DS:SI指明的内存单元数据传送到ES:DI知名的内存单元中。
MOVS 指令常与无条件重复前缀REP联合使用:
如: REP MOVSB;
REP MOVSW;
(任何一个串操作指令,都可以在前面加一个重复前缀,以实现串操作的重复执行,重复次数隐含在CX寄存器中
REP ;REP前缀用在MOVS、STOS、LODS指令前,每次执行一次指令,CX减1;直到CX=0,重复执行结束。)
2.串比较指令CMPS
CMPSB
CMPSW
功能:数据串比较,将DS:S指明的源串与ES:DI指明的目的串的对应元素进行比较。比较的结果反映在标志位上,源串与目的串的内容不变;
常用的重复前缀为:REPE或REPNE
REPE CMPSB ;相等时重复比较(REPZ CMPSB)
REPNE CMPSB; 不相等时重复比较(REPNZ CMPSB)
最重要的来了,ZF=0时两个不一样,ZF=1时两个一样,比较类的貌似都是影响标志位
CS是代码段,DS是数据段,SS是堆栈段,ES是附加段。把内存分段后,每一个段就有一个段基址,段寄存器保存的就是这个段基址的高16位,这个16位的地址左移四位(后面加上4个0)就可构成20位的段基址。
发现不相等时,SI和DI减一才是不相等的数据。
3.串扫描指令SCAS
指令格式 SCASB
SCASW
功能:在ES:DI指明的串中搜索特定数据。特定数据存在AL(或AX)中。
SCASB,隐含操作数AL,将串中的元素与AL进行比较,以字节为单位
SCASW ,隐含操作数AX,将串中的元素与AX进行比较,以字为单位。
说明:串中的元素与AL或AX做减法操作,结果不回送,只影响标志。
CF——进位标志(Carry Flag)。若CF=1,表示算术运算时产生进位或借位,否则CF=0。移位指令会影响CF。
PF——奇偶标志(Parity Flag)。若PF=1,表示操作结果中“1”的个数为偶数,否则PF=0。这个标志位主要用于检查数据传送过程中的错误。
AF——辅助进位标志(Auxiliary Carry Flag)。若AF=1表示字节运算产生低半字节向高半字节的进位或借位,否则AF=0。辅助进位也称半进位标志,主要用于BCD码运算的十进制调整。
ZF——全零标志(Zero Flag)。若ZF=1,表示操作结果全为零,否则ZF=0。
SF——符号标志(Sign Flag)。若SF=1,表示符号数运算后的结果为负数,否则SF=0。
OF——溢出标志(Overflow Flag)。若OF=1,表示当进行算术运算时,结果超过了最大范围,否则OF=0。
IF——中断允许标志(Interrupt Enable Flag)。若IF=1,则CPU可以响应外部可屏蔽中断请求;若IF=0,则CPU不允许响应中断请求。IF的状态可由中断指令设置。
DF——方向标志(Direction Flag)。若DF=1,表示执行字符串操作时按着从高地址向低地址方向进行;否则DF=0。DF位可由指令控制。
TF——单步标志(Trace Flag)。又称跟踪标志。该标志位在调试程序时可直接控制CPU的工作状态。当TF=1时为单步操作,CPU每执行一条指令就进入内部的单步中断处理,以便对指令的执行情况进行检查;若TF=0,则CPU继续执行程序。
原文:https://blog.****.net/iamduoluo/article/details/7170250
4.取串指令LODS 常出现在循环中
指令格式:
LODSB
LODSW
LODS OPRD
功能:在串中取数据。将DS:SI指明的串中元素传送到AL或AX中。
LODSB,隐含操作数AL,将DS:SI指明的串中元素传送到AL,传送一个字节。
LODSW,隐含操作数AX,将DS:SI指明的串中元素传送到AX,传送一个字。
说明:指令不影响状态标志,一般不带有重复前缀。
5.存串指令STOS
指令格式: STOSB
STOSW
功能:把数据存入串中。把AL或AX中的数据传送到ES:DI指明的串中。
STOSB,隐含操作数AL,把AL的内容传送到ES:DI指明的串中,传送一个字节。
STOSW,隐含操作数AX,把AX的内容传送到ES:DI指明的串中,传送一个字。
说明:指令不影响状态标志。一般带有重复操作前缀REP,相当于用AL或AX初始化某数据。
程序控制指令
程序控制指令用于引导和改变程序的流程。程序控制指令又称为控制转移指令,包括:转移指令,循环控制指令,过程调用指令和中断指令4类。
转移指令
2.无条件转移指令
无条件转移指令也称跳转指令。他使程序离开原程序位置而跳转到指令指定的另一程序位置去执行。
目的地址=源地址+指令字节数+偏移量
(JMP指令中到达的地址) (JMP指令所在的地址)(baocunJMP指令所需的字节)(8或16位符号数)
程序执行的位置由代码段寄存器CS与指令指针寄存器IP两者的内容决定。
段内:目标地址只修改IP内容。
段间:目标地址同时修改CS与IP内容。
直接:目标地址直接出现在指令中。
段间:目标地址没有直接出现在指令中。
2.单标志位条件转移指令
JZ与JNZ
指令格式:JZ OPR
测试条件:ZF=1
执行操作:ZF=1时则转至OPR;否则顺序执行。