概述
- 传送指令
- 通用传送指令
- MOV ——字节或字的传送指令
- MOV reg/mem,imm(无seg,立即数不能直接赋给段寄存器,且不能作为目的操作数(无法存储)以字母开头的常数要有前导0)
- MOV reg/men/seg,reg(寄存器具有明确的字节和字类型,但任何变量使用前都要先定义)
- MOV reg/seg,mem(不存在存储器向存储器的传送指令)
- MOV reg/men,seg(无seg)
- 代码段段寄存器(CS)不能作为目的操作数
- SS没必要赋值,系统会默认指定
- DS、ES的段基地址可以相同
- 要记得 MOV AX,DATA[BX][SI],其中DATA作为变量时,是其偏移地址与BX、SI的内容相加,作为相对基址变址寻址
- 图示
- 非法指令的主要现象
- 两个操作数的类型不一致
- 无法确定是字节量还是字量操作(eg.立即数传给变量,要先定义变量(最好给出类型说明),否则无法确定;eg.立即数传给存储单元,要先类型说明,否则无法确定)
- 两个操作数都是存储器(8086指令系统除串操作指令外,不允许两个操作数都是存储单元(存储单元操作数))
- 段寄存器的操作有所限制
- 要记得只有AX、BX、CX、DX才能分为H、L;且思维要严谨,DH要先清零,否则传送的数可能变了(以保证数的大小不变,只是位扩)
- AX在CPU内部,不会出现在存储器,所以应该改为ES:[AX]
- DX不能作为存储器操作数表达式(即不能作为寄存器间接寻址)
- 堆栈操作指令
- 先进后出(FILO)、后进先出(LIFO),但可随机读取
- 堆栈只有一个出/入口,即当前栈顶,用堆栈指针寄存器SP指定
- 申请好存储空间后,SS指向最小偏移地址,SP(栈顶指针)指向指向最大的存储空间(存储时仍为小端方式)
- 堆栈操作的单位为“字”
- 堆栈在程序执行中,可以用来中间缓存或者存储段内调用/段间调用时的偏移地址/段地址+偏移地址
- 堆栈指令中的操作数只能是寄存器或存储器操作数,不能是立即数
- 堆栈操作遵循先进后出原则(SP),但可用存储器寻址方式(BP)随机存取堆栈中的数据
- PUSH——入栈指令
- PUSH r16/m16/seg 即 SP⬅SP-2;SS:[SP]⬅r16/m16/seg
- 记得SP先减2
- SP指向当前最大的存储单元
- 对字进行操作
- 存放时为小端方式,但是先放高位再放低位,即进栈时SP-2
- POP——出栈指令
- POP r16/m16/seg 即 r16/m16/seg⬅SS:[SP]; SP⬅SP+2
- 记得先出栈再减2
- 对字进行操作
- 出栈指令把栈顶的一个字传送至指定的目的操作数
- 不能编程执行 POP CS
- XCHG——字节或字的交换指令
- XCHG reg reg/mem
- XCHG mem reg
- 交换的类型要相同,且不能在存储器与存储器之间对换数据
- XLAT——字节的查表指令(对于既定的表进行查找)
- 将BX指定的缓冲区中、AL指定的位移处的一个字节数据取出赋给AL(要注意:BX指定的为0,如果AL为3,是指0、1、2、3中的3)
- 在主存中建立一个字节量表格,内含要转换成的目的代码
- 表格首地址存放于BX,AL存放相对表格首地址的位移量
- 记得,是将AL寄存器的内容转换成目标代码
- MOV ——字节或字的传送指令
- 目的地址传送指令
- LEA——有效地址传送指令
- 将存储器操作数的有效地址送至指定的16位通用寄存器
- 源操作数为操作数的有效地址(即存放操作数的存储单元的地址)
- LEA r16,mem (等价于 MOV r16,OFFSET mem)
- LDS——偏移地址及其数据段段地址传送指令
- LDS r16,mem
- 从mem存储单元开始的4个连续存储单元中取出某变量的地址指针(共4个字节),将其前两个字节(即变量的偏移地址)传送到r16,后两个字节(即变量的段地址)传送到DS段寄存器中
- 为32位操作指令
- LES——偏移地址及其附加段段地址传送指令
- LES r16,mem
- 从mem存储单元开始的4个连续存储单元中取出某变量的地址指针(共4个字节),将其前两个字节(即变量的偏移地址)传送到r16,后两个字节(即变量的段地址)传送到ES段寄存器中
- 为32位操作指令
- LEA——有效地址传送指令
- I/O传送指令
- I/O口地址为8位时,口地址为“立即数”
- I/O口地址为16位时,口地址应存放在“DX”中,且不加方括号
- IN/OUT指令,必须应用累加器AX/AL
- IN——I/O操作的输入指令
- IN AX/AL,i8/DX
- IN指令是将指定端口 i8/DX 中的内容输入到累加器AL/AX中
- 只能传到AX/AL
- i8表示8位端口号,DX中的内容为16位端口号
- OUT——I/O操作的输出指令
- OUT i8/DX,AX/AL
- OUT指令是将累加器AX/AL中的内容输出到指定端口i8/DX
- 标志传送指令
- PUSHF——标志寄存器入栈指令
- 将16位标志寄存器F内容入栈保护
- POPF——出栈至标志寄存器指令
- 将当前栈顶和次栈顶中的数据字弹出送回到标志寄存器F中
- LAHF——SF、ZF、AF、PF、CF对位传送至AH(SF、ZF、、AF、、PF、、CF)
- 将标志寄存器F的低字节(共包含5个状态标志位)传送到A寄存器中
- SAHF——AH对位传送至SF、ZF、AF、PF、CF
- 将AH寄存器内容传送到标志寄存器F的低字节
- 对位传送
- PUSHF——标志寄存器入栈指令
- 通用传送指令
- 算术运算类指令
- 注意:这类指令会根据运算结果影响状态标志,有时要利用某些标志才能得到正确的结果,使用时亚奥注意有关状态标志的变化
- 加法运算
- 无符号数的加减法运算,计算小数点后的数的相加或相减时,用ADD或SUB;计算后,要带CF的ADC或SBB计算整数,逻辑要很清晰
- ADD——普通加法指令(目的⬅目的+源)
- ADD dest,src
- ADD指令使目的操作数加上源操作数,和的结果送到目的操作数
- 注意,无论是有符号或无符号数运算,都会影响OF,只不过无符号数关注CF,有符号数关注OF
- 注意对OF、SF、ZF、PF、CF的影响
- ADC——带进位位加法指令(目的⬅源+目的+CF)
- 注意:CF是指令执行前CF的标志
- INC——加一指令(目的⬅目的+1)
- 不影响CF标志,而ADD、ADC等会影响
- INC reg/mem
- 单操作数指令
- AAA——非组合BCD码加法的加六修正指令
- 非组合BCD码➡Eg. 69H=(0000 0110 0000 1001)BCD=0609H
- 字节操作
- 隐含寄存器为AL,因此需要先将代调整的数,ADD或ADC后到AL(目的操作数),然后调整之后传到指定位置,且未组合BCD码要按每个十进制位计算
- DAA——组合BCD码加法的加六修正指令
- 字节操作
- 隐含寄存器为AL,因此需要先将代调整的数,ADD或ADC后到AL(目的操作数),然后调整之后传到指定位置,且未组合BCD码要按每个十进制位计算
- 减法运算
- SUB——普通减法指令(目的⬅目的-源)
- SUB dest,src
- SUB指令使目的操作数减去源操作数,差的结果送到目的操作数
- 注意对OF、SF、ZF、PF、CF的影响
- SBB——带进位位减法指令(目的⬅目的-源-CF)
- 注意:CF是指令执行前CF的标志
- DEC——减一指令(目的⬅目的-1)
- 不影响CF标志,而SUB、SBB等会影响
- DEC reg/mem
- 单操作数指令
- NEG——(把操作数作为无符号数)求补指令
- NEG reg/mem 即 reg/mem⬅0-reg/mem
- NEG指令对标志的影响与用零作减法的SUB指令一样
- 单操作数指令
- 把操作数作为无符号数
- 若操作数为正数或无符号数,NEG指令是求与正数真值相等的负数的补码
- 若操作数为有符号数或补码,NEG指令是求一负数的绝对值
- CMP——比较指令(目的-源,只影响FLAGS寄存器)
- 结果不回传目的,不影响两操作数的值
- CMP dest,src
- 比较指令通过减法运算影响状态标志(6个状态标志位),用于比较两个操作数的大小关系
- 无符号数比较大小(若ZF=1,两数相等;若ZF=0,判断CF)
- 有符号数比较大小(若ZF=1,两数相等;若ZF=0,判断SF、OF)
- AAS——未组合BCD码的减法减六修正指令
- 字节操作
- 隐含寄存器为AL,因此需要先将代调整的数,ADD或ADC后到AL(目的操作数),然后调整之后传到指定位置,且未组合BCD码要按每个十进制位计算
- DAS——组合BCD码减法的减六修正指令
- 字节操作
- 隐含寄存器为AL,因此需要先将代调整的数,ADD或ADC后到AL(目的操作数),然后调整之后传到指定位置,且未组合BCD码要按每个十进制位计算
- SUB——普通减法指令(目的⬅目的-源)
- 乘法运算
- MUL——无符号数乘法指令
- MUL reg/mem
- (被乘数)隐含寄存器是AL(字节乘)与AX(字乘)
- 乘数不能是立即数
- 乘积存入AX(字节乘)和DX(字乘)
- CF=OF=0
- 表示AL或AX中乘积有效
- 表示AH或DX中的乘积为0
- 注意:AH或DX要先清零
- CF=OF=1
- 表示AX或DX:AX中的乘积均有效
- IMUL——带符号数(整数)乘法指令
- 补码运算,最后结果也是补码
- IMUL reg/mem
- (被乘数)隐含寄存器是AL(字节乘)与AX(字乘)
- 乘数不能是立即数
- 乘积存入AX(字节乘)和DX(字乘)
- CF=OF=0
- 表示AL或AX中乘积有效
- 表示AH或DX中的乘积为0或全F(有符号数,负数符号位为1)
- 注意:AH或DX要先清零
- CF=OF=1
- 表示AX或DX:AX中的乘积均有效
- 表示AH或DX中的乘积全0或全F
- 计算过程分析
- AAM——未组合BCD码的乘法修正指令
- 隐含寄存器为AX
- 只能够修正 未组合BCD码 字节乘法 的积
- 在乘积之后修正
- MUL——无符号数乘法指令
- 除法运算
- DIV——无符号数除法指令
- DIV reg/mem
- (被除数)隐含寄存器是AX(字节除)与DX:AX(字除)
- 除数不能是立即数、
- 商存入AL(字节除)与AX(字除)中
- 余数存入AH(字节除)与DX(字除)中
- 高余低商
- 除法指令不影响标志寄存器FLAGS的状态标志
- 除数为零或商超出累加器的容量,产生除法错中断,即0型中断
- IDIV——带符号数除法指令
- IDIV reg/mem
- (被除数)隐含寄存器是AX(字节除)与DX:AX(字除)
- 除数不能是立即数、
- 商存入AL(字节除)与AX(字除)中
- 余数存入AH(字节除)与DX(字除)中
- 高余低商
- 除法指令不影响标志寄存器FLAGS的状态标志
- 除数为零或商在补码范围之外,产生除法错中断,即0型中断
- AAD——未组合BCD码的除法修正指令
- 隐含寄存器为AX
- 只能够修正未组合BCD码字节除法的被除数
- 在除法之前进行调整操作——将累加器AX中的2位非压缩型十进制的被除数调整为二进制数,保留在AL中
- 位扩展指令
- CBW——带符号数“字节”扩展为“字”的指令
- CWD——带符号数“字”扩展为“双字”的指令
- CBW和CWD:为IDIV指令设置的符号扩展指令,用来扩展被除数字节/字为字/双字的符号,所扩充的高位字节/字部分均为低位的符号位。它们在使用时应安排在IDIV指令之前,执行结果对标志位没有影响。
- 对DIV无符号数除法应该采用直接使高8位或高16位清0的方法,以获得倍长的被除数。
- 位数加长,大小没变
- DIV——无符号数除法指令
- 位操作类指令
- 以二进制位为基本单元进行数据的操作
- 双操作数逻辑指令AND、OR、XOR和TEST设置CF=OF=0(固定为 0,结果不影响),根据结果设置SF、ZF和PF状态,而对AF未定义
- 逻辑运算
- AND——按位“与”逻辑运算指令
- OR——按位“或”逻辑运算指令
- NOT——按位“非”逻辑运算指令
- 单操作数
- 结果不影响标志位
- XOR——按位“异或”逻辑运算指令
- TEST——按位“位测试”(与逻辑)逻辑运算指令
- 对两个操作数执行逻辑与运算,结果并不送目的操作数,仅按AND指令影响标志
- AND与TEST指令的关系,同SUB与CMP指令的关系一样
- TEST指令是将字节/字操作数按位进行“与”运算
- TEST指令不影响原操作数
- TEST指令只影响标志寄存器FLAGS的状态标志
- 要学会利用TEST指令
- 综合应用一 (记得加上符号位)
- 综合应用二——AND可以用来清零;OR用来置1;XOR用来取反(与1异或)
- 移位指令
- 移位指令的第一个操作数是指定的被移位的操作数,可以是寄存器或存储单元;后一个操作数表示移动的位数:
- 该操作数为1,表示移动一位
- 该操作数大于1,用CL寄存器值表示移位位数 (只能用CL表示)
- 移位指令均影响标志寄存器FLAGS的“CF”标志位
- 按照移入的位来设置进位标志CF,根据移位后的结果影响SF、ZF、PF
- SAR是对带符号数操作,SHR是对无符号数操作
- 很好的例子!要学会分析和思考(记得AH先清零)
- 算术移位
- SAL——按位“算术左移”运算指令
- SAL reg/mem,1/CL
- 最低位补0,最高位进入CF
- 左移一位相当于“x2”(最高有效位1未被移出前),移动8位后全部为0
- SAR——按位“算术右移”运算指令
- SAR reg/mem,1/CL
- 最高位不变(保持符号位不变),最低位进入CF
- SAL——按位“算术左移”运算指令
- 逻辑移位
- SHL——按位“逻辑左移”运算指令
- SHL reg/mem,1/CL
- 最低位补0,最高位进入CF
- 左移一位相当于“x2”(最高有效位1未被移出前),移动8位后全部为0
- SHR——按位“逻辑右移”运算指令
- SHR reg/mem,1/CL
- 最高位补0,最低位进入CF
- 右移一位相当于“➗2”,移动8位后全部为0
- SHL——按位“逻辑左移”运算指令
- 移位指令的第一个操作数是指定的被移位的操作数,可以是寄存器或存储单元;后一个操作数表示移动的位数:
- 循环移位指令
- 循环移位指令的操作数形式与移位指令相同,按指令功能设置进位标志CF(都会影响CF!不带进位循环移位也会影响),但不影响SF、ZF、PF、AF标志(要特别注意!)
- 图示,注意移入CF的位
- 这道题要特别注意,要考虑全面,以及不能使用ROL和RCR是因为非压缩BCD码高4位是任意的,不一定全为0
- ROL——按位“循环左移”运算指令
- ROL reg/mem,1/CL
- 不带进位循环左移
- ROR——按位“循环右移”运算指令
- ROR reg/mem,1/CL
- 不带进位循环右移
- RCL——按位“带进位位循环左移”运算指令
- RCL reg/mem,1/CL
- 带进位循环左移
- RCR——按位“带进位位循环右移”运算指令
- RCR reg/mem,1/CL
- 带进位循环右移
- 串操作指令(默认的ES不能用超越前缀改变([DI])
- 特点
- 通常须用“SI”、“DI”、“CX”、“ES”寄存器
- 应严格区分源(SI)与目的(DI)寄存器的使用
- SI与DI地址自动改变的方向,由D的值控制(CLD即DF=0,递增;STD即DF=1,递减)CLD和STD只在串操作中起作用
- CX作为计数器,特别是应用重复前缀指令时
- B为字节操作、 W为字操作,无操作数指令
- 运用(隐含条件:CX-1≠0;CX为隐含计数器,用于REP、LOOP、REPZ、REPNZ),如果只有跳转指令,要DEC CX,判断ZF跳转
- MOVS——串传送指令
- ES: [DI] ← DS:[SI]
- MOVSB、MOVSW
- 若要在同一个段内,可以将ES和DS赋相同的值
- 单独使用MOVS时,要记得两个操作数都要加上同样的类型说明
- LODS——读串操作指令
- AX/AL ← DS:[SI]
- LODSB、LODSW
- 对处理器而言,读是读入,写是写出;对存储器而言,读是读出,写是写入
- 应用举例
- STOS——写串操作指令
- ES: [DI] ← AL/AX
- STOSB、STOSW
- 应用举例
- CMPS——串比较指令
- ES: [DI] — DS:[SI]
- CMPSB、CMPSW
- 按位一一进行比较
- 应用举例 记得那个DEC
- SCAS——串搜索指令
- AX/AL— ES: [DI]
- 待查关键字放在AL/AX
- SCASB、SCASW
- 找到时,ZF=1
- 应用举例
- 重复前缀
- REP——无条件重复前缀
- Eg.串传递未传递结束
- REPE/PEPZ(ZF=1)——零条件重复前缀指令
- REPNE/REPNZ——非零条件重复前缀指令
- Eg.比较串时,位置对应未不相等时结束比较
- REP——无条件重复前缀
- 特点
- 寄存器的应用
- 控制指令
- 控制转移类指令通过改变IP(和CS)值,实现程序执行顺序的改变(理解:IP是指向下一条要执行的指令)
- 目标地址的寻址方式
- 相对寻址方式
- 指令代码中提供目的地址相对于当前IP的位移量,将要转移到的目的地址(转移后的IP值)就是当前IP值加上位移量
- 用标号表达
- 直接寻址方式
- 指令代码中提供目的逻辑地址,转移后的CS和IP值直接来自于指令操作码后的目的地址操作数
- 用标号表达
- 间接寻址方式
- 指令代码中指示寄存器或存储单元,目的地址从寄存器或存储单元中间接获得
- 用寄存器或存储器操作数表示
- 段内寻址
- 段内转移——近转移(near)
- 在当前代码段64KB(±32KB)范围内转移
- 不需要更改CS段地址,只要改变IP偏移地址(所以IP偏移地址入栈,出栈偏移地址)
- 段内转移——短转移(short)
- 转移范围可以用一个字节表达,在段内-128~+127范围的转移
- 段间转移——远转移(far)
- 从当前代码段跳转到另一个代码段,可以在1MB范围(20根地址总线)
- 需要更改CS段地址和IP偏移地址
- 目标地址必须用一个32位数表达,叫做32位远指针,它就是逻辑地址
- 实际编程时,汇编程序会根据目标地址的属性,自动处理成短转移、近转移或远转移
- 程序员可用操作符short、near ptr 或far ptr 强制成为需要的转移类型
- 段内转移——近转移(near)
- 相对寻址方式
- JMP——无条件转移指令(记得看动画)
- JMP label
- 只要执行无条件转移指令JMP,就使程序转到指定的目标地址,从目标地址处开始执行指令
- 操作数label是要转移到的目标地址(目的地址、转移地址)
- 4种类型
- JMP label; IP⬅IP+位移量——段内转移、相对寻址
- JMP r16/m16;IP⬅r16/m16——段内转移、间接寻址
- JMP far ptr label;IP⬅偏移地址,CS⬅段地址——段间转移、直接寻址
- JMP far ptr mem;IP⬅[mem],CS⬅[mem+2]——段间转移、间接寻址
- 寄存器只能16位,所以必须用存储器
- Jcc——条件转移指令(标志位)
- 6个标志位,OF、SF、ZF、PF、AF、CF
- Jcc指令不影响标志,但要利用标志
- Jcc label——label是一个标号、一个8位位移量,表示Jcc指令后的那条指令的偏移地址,到目标指令的偏移地址的地址位移,label只支持短转移(-128~+127)的相对寻址方式;IP←IP+8位位移量
- ①判断单个标志位状态
- JZ/JE和JNE/JNE(E=Equal ,Z=zero)——利用零标志ZF,判断结果是否为零(或相等)
- JS和JNS——利用符号标志SF,判断结果是正是负(常结合TEST使用)
- JO/JNO——利用溢出标志OF,判断结果是否产生溢出
- JP/JPE(even偶)和JNP/JPO(odd奇)——利用奇偶标志PF,判断结果中“1”的个数是偶是奇
- JC/JNC——利用进位标志CF,判断结果是否进位或借位
- 例题
- 要特别注意第三种方法,不能使用循环指令,因为循环指令不影响SF、ZF、PF标志位
- 奇偶校验,要记得AND,OR,XOR都隐含条件:CF=OF=0
- ②比较无符号数高低
- 无符号数的大小用高(Above)、低(Below)表示,需要利用CF确定高低、利用ZF标志确定相等(Equal)
- 转移指令
- ③比较有符号数大小
- 判断有符号数的大(Greater)、小(Less),需要组合OF、SF标志、并利用ZF标志确定相等与否
- 转移指令
- ④判断CX寄存器转移指令
- 格式:JCXZ 标号;转移条件:(CX)= 0
- CALL——调用过程(子程序)指令
- 当主程序(调用程序)需要执行子程序时,采用CALL调用指令转移到该子程序的起始处执行
- 子程序要有RET返回指令回到主程序继续执行
- 转移指令有去无回,子程序调用需要返回,其中利用堆栈保存返回地址
- 四种类型
- CALL label——段内调用、直接寻址
- 入栈偏移地址IP
- SP←SP-2,SS:[SP]←IP
- RET ;无参数段内返回
- RET i16 ;有参数段内返回
- 段内返回——出栈偏移地址IP
- IP←SS:[SP], SP←SP+2
- CALL r16/m16——段内调用、间接寻址
- 入栈偏移地址IP
- SP←SP-2,SS:[SP]←IP
- RET ;无参数段内返回
- RET i16 ;有参数段内返回
- 段内返回——出栈偏移地址IP
- IP←SS:[SP], SP←SP+2
- CALL label——段间调用、直接寻址
- 入栈偏移地址IP和段地址CS
- ①SP←SP-2,SS:[SP]←CS
- ②SP←SP-2,SS:[SP]←IP
- RET ;无参数段间返回
- RET i16 ;有参数段间返回
- 段间返回——出栈偏移地址IP和段地址CS
- ①IP←SS:[SP],SP←SP+2
- ②CS←SS:[SP],SP←SP+2
- 入栈偏移地址IP和段地址CS
- CALL far ptr mem——段间调用、间接寻址(只能是mem,32位逻辑地址)
- 入栈偏移地址IP和段地址CS
- ①SP←SP-2,SS:[SP]←CS
- ②SP←SP-2,SS:[SP]←IP
- RET ;无参数段间返回
- RET i16 ;有参数段间返回
- 段间返回——出栈偏移地址IP和段地址CS
- ①IP←SS:[SP],SP←SP+2
- ②CS←SS:[SP],SP←SP+2
- 入栈偏移地址IP和段地址CS
- CALL label——段内调用、直接寻址
- RET——过程(子程序)返回指令
- JCXZ——判断CX寄存器转移指令(CX=0跳转)
- 当CX=0时跳转
- 可以用在作为循环的条件,每次循环都会执行 DEC CX ,之后判断CX=0?,然后跳转
- 循环指令(短地址寻址)
- CX作为隐含计数器,判断条件CX-1=0?
- LOOP label——无条件循环指令
- 首先CX←CX-1;然后判断;若CX≠0,转移
- LOOPE/LOOPZ——零条件循环指令
- 首先CX←CX-1;然后判断;若CX≠0,ZF=1, 转移
- 循环结束条件:ZF=0或CX-1=0
- LOOPNE/LOOPNZ——非零条件循环指令
- 首先CX←CX-1;然后判断;若CX≠0,ZF=0, 转移
- 循环结束条件:ZF=1或CX-1=0
- 中断指令
- 中断执行和返回时,SP和IP的状态
- ①中断执行时:a.当前FLAGS入栈 b.当前CS入栈 c.当前IP入栈
- ②根据中断向量:(中断服务程序首地址)➡ IP;(中断服务程序段地址)➡ CS
- ③中断返回时:a.IP出栈 b.CS出栈 c.FLAGS出栈
- INT——中断指令
- 8086CPU支持256种中断,每种中断用一个编号(中断向量号)区别,前32个由Intel提供给系统用
- INT 中断类型号(i8——0~255)/INTO
- 中断类型号的范围:0~255
- 中断向量(矢量):中断类型号x4(提供中断入口)
- INTO——溢出中断指令
- 无操作数指令,中断类型号=4
- IRET——中断返回指令
- 先打断最后恢复,后打断最先恢复(堆栈压入和弹出地址)
- 中断执行步骤
- ①在AH寄存器中设置系统功能调用号
- ②在指定寄存器中设置入口参数
- ③用中断调用指令( INT i8)执行功能调用
- ④根据出口参数分析功能调用执行情况
- INT 21H 功能号
- AH⬅功能号
- 功能号的使用及功能、入口参数、出口参数(要特别注意出、入口参数)
- 记得输出字符串,最后必须添加一个'$'结尾(并不显示)
- ROM-BIOS功能调用
- 中断调用BIOS功能格式
- 入口寄存器与参数赋值
- AH⬅功能号
- INT 中断类型号
- BIOS中断功能举例(熟悉 MOV AH,0EH INT 10H 通常BX=0)
- 中断调用BIOS功能格式
- 中断执行和返回时,SP和IP的状态
- 8086微处理器CPU控制指令
- 标志操作
- CLC——进位标志位置“0”指令
- CMC——进位标志位置求反指令
- STC——进位标志位置“1”指令
- CLD——方向标志位置“0”指令(地址递增)
- STD——方向标志位置“1”指令(地址递减)
- CLI——中断标志位置“0”指令(禁止中断)
- STI——中断标志位置“1”指令(允许中断)
- 进位标志清零的方法举例
- ①CLC
- ②XOR AX,AX
- ③ADD AX,0
- 操作微处理器
- HLT——微处理器暂停指令
- 暂停指令:CPU进入暂停状态
- 用法
- ①控制主程序的结尾
- ②控制主程序等待中断
- ③控制程序中不能够用返回DOS中断方式
- NOP—— 微处理器空操作指令、
- 空操作指令,等同于“xchg ax,ax” 指令
- 一般用于延时
- ESC—— 微处理器脱离指令(命令协处理器)
- WAIT——微处理器等待指令
- LOCK——微处理器锁定指令(指令前缀,总线锁定前缀)
- HLT——微处理器暂停指令
- 标志操作
最后
以上就是谨慎信封为你收集整理的汇编指令汇总的全部内容,希望文章能够帮你解决汇编指令汇总所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复