寻址方式与指令系统.ppt_第1页
寻址方式与指令系统.ppt_第2页
寻址方式与指令系统.ppt_第3页
寻址方式与指令系统.ppt_第4页
寻址方式与指令系统.ppt_第5页
已阅读5页,还剩88页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第3章寻址方式和指令系统 用来指挥和控制计算机完成指定操作的命令称为指令 不同的微处理器具有各自不同的指令 每种微处理器能够识别和执行的所有指令的集合称为该微处理器的指令系统 程序 是由一系列有序指令组成的有序集合指令通常是用英文助记符来表示 3 18088 8086指令格式 标号 操作码操作数 操作数 注释操作码规定计算机所执行的操作 操作数用来描述该指令的操作对象 为参加操作的数据或其存放的地址 根据完成的命令和程序设计要求的不同 可以缺省除操作码以外的其余三项 但必须由操作码才能组成不同功能的指令 3 28088 8086的寻址方式 所谓寻址方式 就是寻找操作数或操作数地址的方式 与数据有关的寻址方式有 立即数寻址 MOVAX 3000H直接寻址 MOVAX 2004H 寄存器寻址 MOVAX BX寄存器间接寻址 MOVAX SI 变址寻址 MOVAX DI 20H 基址寻址 MOVAX COUNT BX 基址加变址寻址 MOVAX 20 BP DI 1 立即寻址 MOVAX 2004H AH 20H AL 04HMOVBL 5AH BL 5AH 2 寄存器寻址 MOVAL BL 将BL中的数送AL中 BL内不变MOVDS AX 将AX中的数送DS中 DI保持不变 3 直接寻址 指的是操作数在存储器中的有效地址EA内 书写时有效地址加上中括号MOVAX 1000H 将DS段的1000H和1001H两个单元的内容送入AX寄存器中MOVAX ES 2000H 将ES段的2000H 2001H两个单元的内容送入AX寄存中 MOVAX BUF 将DS段内以定义变量BUF的有效地址起始的两个单元的内容送入AX中 4 寄存器间接寻址 操作数的偏移地址放在基址寄存器BX BP或变址寄存器SI DI中 则 操作数的物理地址为 DS 16 SI DI BX EA 或 SS 16 BP 例1 假定 DS 2000H SS 3000H SI 3600H 23600H 6022H 33600H 7069HMOVAX SI AX 数据6022H送入AX例2 假定 SS 3000H DS 2000H BP 1100H 31100H 5E28H 21100H 5728HMOVBX BP BX 5 变址寻址与基址寻址 操作数的有效地址是一个基址寄存器或变址寄存器中存放的数据或再加上指令给出的8位或16位偏移量 其物理地址为 DS 16 SI DI BX 8位或16位偏移量或 SS 16 BP 8位或16位偏移量例 假定 DS 2000H SS 3000H SI 3600H BP 1100H COUNT 10H 23620H 8A76H 31110H 4567HMOVAX SI 20H MOVBX BP COUNT MOVBX COUNT BP 6 基址变址寻址 操作数的有效地址只能是一个基址寄存器和一个变址寄存器的和或再加上8位或16位偏移量 其物理地址为 DS 16 BX SI DI 8位或16位偏移 SS 16 BP SI DI 8位或16位偏移量 MOVAX BX DI MOVAX BP SI MOVAX BX SI 100H MOVCX BX SI NUM 例 假定 DS 2000H SS 3000H BX 1800H BP 2080H DI 1000H SI 0800H NUM 067AH 写出以上各源操作数的物理地址 3 38088 8086指令系统 8086指令系统是80 x86的基本指令集 共有100多条指令 按功能可以分为六种类型 数据传送指令算术运算指令逻辑运算与移位指令 位运算类 串操作指令控制转移指令处理器控制指令 3 3 1数据传送类指令 把数据从一个位置传送到另一个位置14条指令分5组1 通用数据传送 MOVXCHGXLAT2 堆栈操作 PUSHPOP3 标志寄存器传送 LAHFSAHFPUSHFPOPF4 地址传送 LEALDSLES5 输入输出 INOUT 例1 立即数与寄存器 存储器传送 MOVAL 55HMOVAX 55AAHMOVCX 0F943HMOVBYTEPTR BX 12H 12h DS BX MOVWORDPTR BX SI 100h 例2 寄存器与寄存器 存储器传送MOVAX BXMOVAH BLMOVAX BX MOV SI ALMOVSS 2000H MOVES DI CSMOVAX CSMOVDS AX 非法传送种种 两个操作数的类型不一致两个操作数不能都是存储器段寄存器之间不能传送数据 立即数也不能直接传送给段寄存不能改CS IP的值举例 非法指令 MOVAL 050AH 目的操作数与源操作数不一致MOVDS 100H 立即数不能传送段寄存器MOVCS SI 不允许直接改变CS值MOVDS ES 不允许段寄存器间传送MOV 2358H BX 不允许两个操作数都是存储单元 2 交换指令XCHG exchange XCHGreg reg mem reg reg mem 交换指令可以在通用寄存器与寄存器之间对换数据交换指令可以在通用寄存器与存储器之间对换数据交换指令不能在存储器与存储器之间对换数据 MOVAX 1234HMOVBX 5678HXCHGAX BX MOVBP 0200HMOVSI 0046HXCHGAX BP SI 执行后 AX 3412H 50246H 21H 50247H 56H 例 设SS 5000H 50246H 12H 50247H 34HAX 5621H 求执行下面指令后AX 换码指令XLAT translate XLAT AL DS BX AL 换码指令执行前 在主存中建立一个字节表格 将AL的内容转换成的目的代码 如ASCII码 表格的首地址存放于BX AL存放相对表格首地址的位移量然后 执行换码指令实现 换码指令使用了隐含寻址方式 例 将0 9 A F的16进制数转换为ASCII码TABLEDB30H 31H 41H 42H 46H 0 9 A F的ASCII码的表格MOVBX OFFSETTABLEMOVAL 10XLAT AL 41H 为A的ASCII码 2 堆栈操作指令 堆栈是主存中一个特殊的区域 它采用先进后出或后进先出的原则进行存取操作 而不是随机存取操作方式 堆栈指针 它指示栈顶位置 在8086中 栈顶由SS和SP共同指示 即SS SP 用户操作 PUSH POP指令 堆栈 堆栈操作指令 规则 PUSH POP指令不能使用立即寻址方式 POP指令不能使用CS寄存器 堆栈操作只能对字为单位进行 不能对字节 每次PUSH操作栈顶SP SP 2 而POP操作栈顶SP SP 2字数据从栈顶压入和弹出时 都是低地址字节送低字节 高地址字节送高字节 堆栈操作遵循先进后出原则 这两条堆栈指令不影响标志位 堆栈只有两种基本操作 进栈和出栈两条指令 堆栈的实例和图例 MOVAX 1278HPUSHAX POPAX 操作 例 现场的保护和恢复 pushax 进入子程序后pushbxpushds popds 返回主程序前popbxpopax 例 将16位通用寄存器CX的内容压入堆栈 然后 弹出栈顶至CX中 已知 SS 0200H SP 0008H CX 12FAH 其示意图见图 PUSHCXPOPCX PUSHCX POPCX 3 地址传送指令 有效地址传送指令LEA把源操作数的有效地址 偏移量 送入指定的寄存器中 格式 LEAREG MEM目标操作数REG是一个16位的通用寄存器 说明 REG不能是段寄存器 这条指令不影响标志位 例如 LEABX 2345 将2345单元的偏移量送入BX 指令执行后 BX中为2345LEAAX BP SI 指令执行后 AX中为BP SI的值 2 LDS取数据段地址指针指令格式 LDSREG MEM 3 LES取附加段地址指针指令格式 LESREG MEM LDSreg16 mem REG16 MEM DS MEM 2LDS指令将主存中mem指定的字送至r16 并将mem的下一字送DS寄存器 LESreg16 mem reg16 mem ES mem 2LES指令将主存中mem指定的字送至r16 并将mem的下一字送ES寄存器 例3 13 若DS 2000H SI 1000H ADDRx 0020HBX 6543H 21000H 1400H 21002H 4000H 21020H 1040H 21022H 4000HLDSBX ADDRx SI PA DS 16 EA 20000H 1000H 0020H 21020H 指令执行后 BX 1040H DS 4000HLESBX SI PA DS 16 20000H 1000H 21000H指令执行后 BX 1400H ES 4000H 4 标志寄存器传送指令 LAHF SAHF PUSHF POPF 标志读写指令LAHF将标志寄存器FLAGS中的低8位 传送至AH中 SAHFSAHF与LAHF正好相反 把AH传送至标志寄存器FLAGS的低8位 LAHF指令操作格式 2 标志入栈出栈指令 格式 PUSHF POPF功能 PUSHF指令是将标志寄存器中的内容压入堆栈 指令的操作为 SP 1 FLAGSH SP 2 FLAGSL SP SP 2POPF指令是将栈顶的字单元内容弹出到标志寄存器中 同时SP SP 2 INAL 80H AL 80H INAX 40H AX 40H INAL DX AL DX INAX DX AX DX OUT60H AL 60H AL OUT60H AX 60H AX OUTDX AL DX AL OUTDX AX DX AX 以上IN和OUT指令的前两种方式是直接端口寻址方式 端口地址是一个8位的立即数 其范围是0 255 两组指令中的后两种格式是间接寻址方式 端口地址DX中 其范围为0 65535 5 输入输出指令 本节学习要求 重点掌握 MOVPUSHPOPINOUT特别熟悉 XCHGXLATLEA一般了解 LAHFSAHFPUSHFPOPFLDSLES练习题 1 将1000 2300H中的两个字节的数据传送到1000 3500H中2 将BX中的数据保护在堆栈 并2000 5302H中的数据交换 3 用两种方法将有效地址3678H送SI变址寄存器 3 3 2算术运算指令 实现二进制 BCD码数据的四则运算1 加法指令 ADD ADC INC2 减法指令 SUB SBB DEC3 求补指令 NEG4 比较指令 CMP5 乘法指令 MUL IMUL6 除法指令 DIV IDIV7 转换指令 CBW CWD8 十进制调整 DDA DAS AAA AAS AAM AAD 1 加法指令ADD ADD指令将源与目的操作数相加 结果送到目的操作数 ADD指令影响6个状态标志位 ADDreg imm reg mem reg reg imm reg memADDmem imm reg mem mem imm reg 举例 MOVAL 46H AL 46HADDAL 0C5H AL 0C5H AL二进制运算无符号数带符号数 AL 46H 0100011070 70 0C5H 11000101197 59自然丢掉100001011267 11SF 0 CF 1 ZF 0 AF 0 OF 0 PF 0 MOVBX 1000HMOVWORDPTR BX 0A988HADDWORDPTR BX 9F76H1010100110001000 100111110111011010100100011111110程序段执行后 1000H 48FEH BX 1000H CF 1 ZF 0 OF 1 SF 0 PF 0 AF 0 带进位加法指令ADC ADC指令将源与目的操作数相加 再加上进位CF标志 结果送到目的操作数ADC指令按状态标志的定义相应设置ADC指令主要与ADD配合 实现多精度加法运算 ADCreg imm reg mem reg reg imm reg mem CFADCmem imm reg mem mem imm reg CF 例17 双字加法 MOVDX 0002H 高16位MOVAX 0F365H 低16位ADDAX 0E024H 低16位 低16位ADCDX 0005H 高16位相加 同时加进位计算结果高16位为0008 DX 为0002 0005 进位CY 低16位为0D389H AX MOVAX 0100H ADDAX 0200H MOV 0300H AX 低字之和存入C单元 MOVAX 0100H 2 装入高字 ADCAX 0200H 2 高字求和考虑低字进位MOV 0300H 2 AX 存入高字之和 若完成段基址为1000H的数据段中这些偏移地址中的数运算 程序又该如何更改 练习题 编程将内存0100H与0200H单元连续4个字节数相加 结果存放在0300H中 加1指令INC increment INC指令对操作数加1 增量 INC指令不影响进位CF标志 只影响其他状态标志 INC INCreg mem reg mem reg mem 1 INCBX BX BX 1INCBYTEPTR DI 100H 将 DI 100H所指的字节单元内容加1INCWORDPTR BX SI 字单元内容加1INCBL BL BL 1 2 减法指令 SUB SBB SUB SUBreg imm reg mem reg reg imm reg memSUBmem imm reg mem mem imm reg 带借位减法指令 SBBreg imm reg mem reg reg imm reg mem CFSBBmem imm reg mem mem imm reg CF 不带借位减法指令 例20 双字减法 MOVDX 0012HMOVAX 7546HMOVCX 0010HMOVBX 9428HSUBAX BXSBBDX CXSUB指令执行后 AX E11EH BX 9428H CF 1 ZF 0 OF 1 SF 1 PF 1 AF 1 SBB指令执行后 DX 0001H CX 0010H CF 0 ZF 0 OF 0 SF 0 PF 0 AF 0 SBB 减量指令DEC decrement DEC指令对操作数减1 减量 DEC指令不影响进位CF标志 按定义设置其他状态标志 DEC INC指令和DEC指令都是单操作数指令主要用于对计数器和地址指针的调整 DECBYTEPTR BX DECWORDPTR BX SI DECBLDECSI 3 求补指令NEG negative NEG指令对操作数执行求补运算 将操作数按位取反后加1NEG指令对标志的影响与用零作减法的SUB指令一样 NEGBYTEPTR BX NEGWORDPTR BX SI NEGBLNEGSI例 MOVBX 6780HNEGBX程序段执行后 BX 9880H CF 1 ZF 0 OF 1 SF 1 PF 0 AF 0 4 比较指令CMP compare CMP指令将目的操作数减去源操作数 按照定义相应设置状态标志CMP指令执行的功能与SUB指令 但结果不回送目的操作数 CMP CMPAX 200JGGREATER 大于则跳转到GREATER ADDAX 100INCCXGREATER 5 乘法指令 MUL IMUL MUL 无符号字节乘法MULBL AX AL r8 m8MULr16 m16 字乘法 DX AX AX r16 m16 IMUL 有符号字节乘法 AX AL r8 m8IMULr16 m16字乘法IMULWORDPTR BX DX AX AX r16 m16 字节相乘时 AL与源操作数相乘 乘积为16位送入AX中 字相乘时 AX与源操作数相乘 乘积为32位 高16位送DX 低16位送AX 对标志位影响 若乘积的高半部分 字节相乘时为AH 字相乘时为DX 不为零 则CF 1 OF 1 否则CF 0 OF 0 其它标志位为任意值 例3 24 乘法运算 MOVAL 0B4HMOVBL 11HMULBL程序段执行后 AX 0BF4H 3060D BL 11H CF OF 1 MOVAL 0B4H 变反加1 为 76 4CH MOVBL 11HIMULBL程序段执行后 AX FAF4H 1292 BL 11H CF OF 1 1 DIV 无符号数除法 指令用法 DIVBL 或BYTEPTR BX 功能 AX 8位操作数 商 AL 余 AH DIVBX 或WORDPTR BX 功能 DX AX 16位操作数商 AX 余 DX IDIV 有符号数除法 指令用法 IDIVBL 或BYTEPTR BX 功能 AX 8位操作数 AL 余 AH IDIVBX 或WORDPTR BX 功能 DX AX 16位操作数 AX 余 DX DIV IDIV对OF SF ZF AF PF CF标志位不影响 除数为0 或者在字节除时商超过8位 或者在字除时商超过16位 则发生除法溢出 6 除法指令 DIVIDIV 例3 26 除法运算 movax 0400h ax 400h 1024movbl 0b4h bl b4h 180divbl 商al 05h 5 余数ah 7ch 124movax 0400h ax 400h 1024movbl 0b4h bl b4h 76idivbl 商al f3h 13 余数ah 24h 36 7 符号扩展 转换 指令 CBW AL的符号扩展至AH 如AL的最高有效位是0 则AH 00 AL的最高有效位为1 则AH FFH AL不变 CWD AX的符号扩展至DX 如AX的最高有效位是0 则DX 00 AX的最高有效位为1 则DX FFH AX不变 MOVAL 80H al 80hCBW ax ff80hMOVAX 727FH CWD DX 0000H AX 727fh 8 BCD码 十进制 调整指令 十进制数调整指令对BCD码运算的结果进行十进制调整 以得到正确运算结果的BCD码 BCD码运算分压缩和非压缩两种 它们的调整方法不同 压缩 组合 BCD码 一个字节中容纳两个BCD码 其范围为 00H 99H 非压缩 非组合 BCD码 一个字节中仅容纳1个BCD码 其范围为 00H 09H 十进制调整指令有6条 对用组合BCD码 未组合BCD码及ASCII码表示的数算术运算后调整 DAA DAS AAA AAS AAM AAD一定是以AL为目的操作数 1 压缩BCD码加法调整指令DAADAA位于ADD和ADC指令后 功能 加法运算后 若使AL低4位 1001B或AF 1 则AL 06H AL 且使CF 1 若使AL高4位 1001B或CF 1 则AL 60H AL且使CF 1 2 压缩BCD码减法的调整指令DASDAS接在SUB或SBB指令后 功能 若AL低4位 1001或AF 1 则进行AL 06H AL 且使AF 1 若AL高4位 1001或CF 1 则进行AL 60H AL 且使CF 1 例题编程 37 3573 27 1 压缩BCD码的调整指令 DAADAS 例3 28压缩BCD家法 例3 29 压缩BCD减法 MOVAL 28HADDAL 68HDAAAL MOVAL 86HSUBAL 07HDASAL 执行SUB指令后 AL 7FH CF 0 AF 1 执行DAS指令后 AL 79H CF 0 AF 1 1 未组合BCD码加法调整指令AAAAAA也称为ASCII码调整指令 接在ADD或ADC之后 功能 若AL低4位 1001或AF 1 则AL 06H AL 且使AF 1 AH 1 AH 执行AL AL 0FH 即将AL高4位清0 CF AF 2 未组合BCD码减法的调整指令AASAAS也称为减法的ASCII码调整指令 参加运算的两个数是未组合BCD或ASCII码 在SUB或SBB指令后执行 功能 若AL低4位 1001或AF 1 则AL 6 AL AH 1 AH 且使AF 1 AL AL 0FH 即将AL高4位清0 CF AF 2 未组合BCD码调整指令 AAA AAS AAM AAD 非压缩BCD码的加减运算举例 实现非压缩BCD码加法 8 9 77MOVAL 08H AL 08 非压缩BCD码表示真值8MOVBL 09H BL 09 非压缩BCD码表示真值9ADDAL BLl 二进制加法 AL 08H 09H 11HAAA 十进制调整 ax 0707h 实现非压缩BCD码减法 68 09 59movax 0608h ax 0608h 非压缩BCD码表示真值68movbl 09h bl 09h 非压缩BCD码表示真值9subal bl 二进制减法 al 08h 09h ffhaas 十进制调整 ax 0509h 3 未组合BCD码乘法的调整指令AAMAAM也称为乘法的ASCII码调整指令 在MUL指令后执行 参加MUL相乘的两个数应当是高4位为0的8位未组合BCD码 功能 执行MUL后 AL 0AH后 商 AH 余数 AL 例 MOVAL 06HMOVBL 07H MULBL AX 002AHAAM AX 0402H 6 7 42 4 未组合BCD码除法的调整指令AADAAD也称为除法的ASCII码调整指令 在DIV指令之前进行 AAD将AX中的未组合BCD码变成二进制数 并放入AL MOVAX 0504H MOVBL 03H AAD AX 0036H先将非压缩BCD码的被除数调整为二进制数DIVBL AX 0012H AAM AL 0AH 商 AH 余数 AL 再用AAM调整为BCD码 例3 30 非压缩BCD加 MOVAX 0535HADDAL 39HAAA执行ADD指令后 AL 6EH AF 0 执行AAA指令后 AX 0604H CF 1 AF 1 MOVAX 0638HSUBAL 39HAAS执行SUB指令后 AL FFH AF 1 执行AAS指令后 AX 0509H CF 1 AF 1 例3 31 非压缩BCD乘 MOVAL 08HMOVBL 09HMULBLAAM执行MUL指令后 AX 0048H执行AAM指令后 AX 0702HAAM和AAD指令根据结果设置SF ZF和PF 但对OF CF和AF无定义 例3 32 非压缩BCD除 MOVAX 0608HMOVBL 09HAADDIVBL执行AAD指令后 AX 0044H 执行DIV指令后 商AL 07H 余数AH 05H 这一节指令要掌握 ADD ADCSUB SBBINC DECCMPNEGMULDIVDAADAS 作业 1 编程实现78 23 并把商存放在BL 余数存放在CL2 取偏移地址3256H中数据1个字负数的绝对值3 编程实现7BH 2347H 将结果存放在1000 2350为首地址的连续的单元中 4 分析程序 MOVAX 3456HMOVBX 4612HSUBAL BLDASXCHGAL AHSBBAL BHDASXCHGAL AH结果AX BX 3 3 3位操作 逻辑运算 指令 以二进制位为基本单位进行数据的操作1 逻辑运算 AND TEST OR XOR NOT2 移位 SHL SHR SAL SAR3 循环移位 ROL ROR RCL RCR 常用指令 应该特别熟悉 同时 注意这些指令对标志位的影响 1 逻辑运算指令的特点 逻辑运算指令主要用于对寄存器或存储器单元中某些位的测试 置位 复位等操作 逻辑运算指令对操作数都是按位进行操作 对相应的标志位产生影响 除NOT指令都使CF 0OF 0 结果回送到目的寄存器或存储器 ANDAL BL 逻辑与ORAX BX 逻辑或NOTBYTEPTR SI 0100H 逻辑取反XORXORAX BX 逻辑异或TESTAX 1234H 测试 同逻辑与不回送 2 逻辑运算指令介绍AND 将指定位清零ANDAL 0FH AL的高4位清零TEST 判断指定位是 0 还是 1 TESTAL 80H 判断AL最高位是否为 1 JNZNEXT 如果为 1 则跳转OR 将指定位置 1 ORAL 01H AL的最低位置 1 XOR 将指定位取反 将寄存器清零XORAL 80H AL的最高位取反XORBL BL BL清0 相当于 MOVBL 0 NOT 将整个操作数取反NOTAL 若执行前 AL 00001111B 则执行后 AL 11110000B ANDORXORTEST指令使CF 0OF 0 3 移位指令1 非循环移位指令 SHL SHR SAL SARSHLAL 1 移位次数为1SARBX CL 移位次数为 CL SHRWORDPTR BX SI CLSALBYTEPTR 2360H 1目的操作数 通用寄存器或存储器操作数移位次数 n只能为1 移位次数大于1时一定要采用寄存器CL286以上系统 移位次数n不受限制 逻辑左移SHL最高位 CF 0 最低位 其他位左移逻辑右移SHR0 最高位 最低位 CF 其他位右移算术左移SAL最高位 CF 0 最低位 其他位左移算术右移SAR新最高位 原最高位 最低位 CF 其他位右移 对标志寄存器的影响 移位次数 1 则 M为移位后操作数的最高位移位次数 1 则 不影响OF 利用移位指令做简单的乘除运算 无符号数 2 SHLAL 1无符号数 2 SHRAL 1带符号数 2 SALAL 1带符号数 2 SARAL 1例 设 AL 12H 18 无符号数 则 SHLAL 1 AL 24H 36 SHRAL 1 AL 09H 9 18 2 9设 AL 0F0H 16 带符号数 则 SALAL 1 AL 0E0H 32SARAL 1 AL 0F8H 8 2 循环移位指令ROL ROR RCL RCR 指令格式 ROLAL 1 移位次数为1RORBX CL 移位次数为 CL RCRWORDPTR BX SI CLRCLBYTEPTR 2360H 1 对标志寄存器的影响 移位次数 0时影响CF 但不影响SF ZF AF PF移位次数 1时 M为移位后操作数的最高位移位次数 1时 OF不受影响 移位过程 循环左移ROL最高位 CF和最低位 其他位左移循环右移ROR最低位 CF和最高位 其他位右移带进位循环左移RCL最高位 CF CF 最低位 其他位左移带进位循环右移RCR最低位 CF CF 新最高位 其他位右移 利用循环移位指令 实现长整数的逻辑 算术移位 例 对双字 DX AX 逻辑左移 SHLAX 1 AX的最高位移到CF中RCRDX 1 CF 即AX的最高位 移到DX的最低位中算术右移 SARDX 1 DX的最低位进入到CF中RCRAX 1 CF 即DX的最低位 进入到AX的最高位中 作业 编程实现如下功能 1 将AL中的无符号数乘8 将BL中的无符号数除4 用两种方法实现2 编程分别将将AL中的D6位清0 D4位置1 D2位取反 其余各位不变3 测试AX中的D13位为1还是为04 用两种方法计算AX AX 10 其中AX为无符号数 5 将AL中压缩的BCD码转换为ASCII码存放在AX中 编程练习 1 用两种方法计算AX AX 10 其中AX为无符号数 1 MULMOVMUL 2 SHLSHLAX 1 2MOVBX AXSHLAX 1 4SHLAX 1 8ADDAX BX 10 2 将AL中压缩的BCD码转换ASCII码存放在AX中 MOVBL ALANDAL 0FHADDAL 30HANDBL 0F0HSHRBL 1SHRBL 1SHRBL 1SHRBL 1ADDBL 30HMOVAH BL 3 编程将内存首地址为0200H的100个字节数据块传送到0100H为首地址的内存区 3 3 4串操作指令 串操作指令就是用一条指令实现对存储器中一串字符或数据的操作 8086指令系统提供了5条基本的串操作指令和3条重复前缀指令 且遵循相同的规则 MOVSLODSSTOSCMPSSCASREPREPZ REPEREPNZ REPNE 1 源操作数用寄存器SI寻址 默认在数据段DS中 即DS SI 目的操作数用寄存器DI寻址 默认在附加段ES中 即ES DI 2 指令后 B 进行字节操作 指令后 W 进行字操作 3 DF 0地址增 每完成1次操作 SI和DI将自动修改 1或 2DF 1地址减 每完成1次操作 SI和DI将自动修改 1或 24 CX中存放数据块的长度 在串操作指令前加重复前缀指令 则自动完成CX 1不等于0 重复操作的过程 1 基本串操作指令 1 串传送指令MOVSB 字节传送 ES DI DS SI SI SI 1 DI DI 1MOVSW 字传送 ES DI DS SI SI SI 2 DI DI 2 2 串读取指令LODSB 字节读取 AL DS SI SI SI 1LODSW 字读取 AX DS SI SI SI 2 3 串存储指令STOSB 字节存储 ES DI AL DI DI 1STOSW 字存储 ES DI AX DI DI 2 4 串比较指令CMPSB 字节比较ES SI DS DI SI SI 1 DI DI 1CMPSW 字传送 ES SI DS DI SI SI 2 DI DI 25 串扫描 搜索 指令SCASB 字节传送 AL ES DI DI DI 1 SCASW 字传送 AX ES DI DI DI 2 编程将首地址为0200H的源字符串传送到0100H为首地址的内存区 字符串的长度为100个字节 2 重复前缀指令 REP CX 1不为0重复操作 否则停止 REPE REPZ CX 1不为0与ZF 1时重复操作 否则REPNE REPNZ CX 1不为0与ZF 0时重复操作 否则REPMOVS STOS 每执行一次串指令 判别CX CX 1若不等于0则重复执行 直到CX 0 结束REPE REPZCMPS SCAS 每执行一次串指令 判断CX CX 1若不等于0并且ZF 1 则重复执行 只要CX 0或ZF 0 结束REPNE REPNZCMPS SCAS 每执行一次串指令 CX CX 1若不等于0并且ZF 0 则重复执行只要CX 0或ZF 1 结束LODS指令之前不能添加重复前缀 例3 44将首地址为0200H的源字符串传送到0100H为首地址的内存区 字符串的长度为100个字节 CLD DF 0 增量方向MOVSI 0200H DS SI 字符串首地址MOVDI 0100H ES DI 目标地址MOVCX 100 字符串长度REPMOVSB CX 1 0重复字符串传送 例3 45比较两个字符串是否为完全相同的元素CLD DF 0 增量方向LEASI STRING1 DS SI 字符串首地址LEADI STRING2 ES DI 目标地址MOVCX 100 字符串长度100REPZCMPSB CX 1 0ZF 1重复比较字符串JNZNOTFOUNT 无相同的元素 例3 46在首地址为ES DEST的字符串中检查是否有字符 M 字符串的长度为200个字节 CLD DF 0 增量方向LEADI ES DEST ES DI 目标地址MOVCX 200 字符串长度MOVAL M AL 搜索字符REPNESCASB CX 1 0ZF 0重复搜索JZFOUNT字符串是否有字符 M 例3 47将首地址为DS SRC的字节数据串中非0元素送到首地址为ES DEST的内存区中 字符串长度为200 CLD DF 0 增量方向LEASI SRC DS SI 字符串首地址LEADI ES DEST ES DI 目标地址MOVCX 200 字符串长度GOON LODSB 取字符串的一个元素CMPAL 0 字符串元素为0吗 JZNEXT 是0 继续下一个元素STOSB 非0 存入首地址ES DEST的内存NEXT DECCXJNEGOON 改变IP 和CS 值 实现程序执行顺序的改变1 无条件转移 JMP 重点 2 条件转移 Jcc 重点 3 循环 LOOPLOOPE LOOPZLOOPNE LOOPNZ4 子程序 CALL 重点 RET5 中断 INTn 重点 IRETINTO控制转移指令根据程序转移地址的不同有 段内转移 只改变IP内容段间转移 改变IP和CS的内容 3 3 5控制转移指令 1 无条件转移指令JMP 1 段内直接转移程序转移到指令中给出的16位或 8位偏移地址 JMPNEXT 转移到本段标号NEXT处JMP1200H IP 1200H 转移CS 1200HJMPSHORTLOOP 段内短转移IP IP 8位偏移量 转向符号地址LOOP处 128 127 JMPNEARPTRL2 段内转移 转向符号地址L2处 2 段内间接转移程序转移的偏移地址在寄存器或存储单元之中 如 JMPCX IP CX JMPWORDPTR BX SI IP AX SI JMPWORDPTR SI IP SI 所指定的存储器字单元之中的16位数据 3 段间直接转移指令中直接给出转移地址的段地址和偏移地址 JMPFARPTRNEXT CS IP 将NEXT处新的段基址和新的偏移地址3250 0024HNEXT MOVAX BX 4 段间间接转移程序转移的段基址和偏移地址是存储单元中存放的32位数据 如DS 2000H DI 3150H JMPDWORDPTR DI IP 23151H 23150H CS 23153H 23152H 23153H23152H23151H23150H 2 条件转移指令 1 根据单个标志位的状态判断转移的指令 以状态标志位 有符号数运算和无符号数运算结果及CX的值为条件转移 区间 128 127字节内 2 根据两个无符号数的比较结果判断转移的指令 A B E N 3 根据两个有符号数的比较结果判断转移的指令G L E N 4 根据CX的内容判断转移的指令 JCXZDESTCX 0 转移到DEST循环 例1 根据单个标志位的状态判断后转移的指令ADDAX BXJCTOO BIG 若加法有进位转至TOO BIG处理SUBAL BLJZZERO 若减法结果为0 转至ZERO处理例2 比较无符号数FEH和05H的大小 执行下面的指令后 将转移到ABC处继续执行指令 MOVAL 0FEHCMPAL 05HJAABC 若 AL 05H 则转向ABC 例47 记录BX中1的个数 XORCX CX CX 0 CF 0NEXT CMPBX 0JENEXTSHLBX 1JNCNEXTINCCXJMPNEXTEXIT CX保存1的个数 3 循环控制指令 LOOP标号 CX 0 则循环否则退出循环LOOPE LOOPZ标号 ZF 1且 CX 0 则循环 否则退出循环 LOOPNE LOOPNZ标号 ZF 0且 CX 0则循环 否则退出循环JCXZDEST CX 0则循环 否则退出循环 例 在以DATA为首地址的内存数据段中 存放有200个16位有符号数 试找出其中最大和最小的有符号数 并分别放在MAX和MIN为首的内存单元中 START LEASI DATA SI 数据块首地址MOVCX 200 CX 数据块长度CLD 清方向标志DFLODSW AX 一个16位有符号数MOVMAX AX 将该数送MAXMOVMIN AX 将该数送MINDECCX CX CX 1NEXT LODSW 取下一个16位有符号数CMPAX MAX 与MAX单元内容进行比较JGLARGER 若大于则转LARGERCMPAX MIN 否则再与MIN单元内容进行比较JLSMALL 若小于MIN的内容则转SMALLJMPGOON 否则就转至GOONLARGER MOVMAX AX MAX AX JMPGOONSMALL MOVMIN AX MIN AX GOON LOOPNEXT CX 1 若CX 0 则转NEXTHLT 4 子程序调用及返回指令 CALL RET 程序设计中 将具有独立功能的程序模块称为子程序 8086汇编中称为过程 程序执行过程中 由调用程序使用调用指令CALL调用这些子程序 当子程序执行后 通过返回指令RET返回主程序 1 调用指令CALL过程名 功能 调用已定义的过程 并将断点地址压入堆栈保护 段内直接调用 CALLYANS SS SP IP SP SP 2 IP YANS处的16位偏移量 段内间接调用 CALLBX SS SP IP SP SP 2 IP BX 偏移量 段间直接调用 CALLFARPTRSUB2 SS SP CS SP SP 2 S

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论