资源预览内容
第1页 / 共62页
第2页 / 共62页
第3页 / 共62页
第4页 / 共62页
第5页 / 共62页
第6页 / 共62页
第7页 / 共62页
第8页 / 共62页
第9页 / 共62页
第10页 / 共62页
亲,该文档总共62页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
二 数据传送指令,存 储 器,I/O 接 口,输 入 设 备,I/O 接 口,数据总线 DB,控制总线 CB,地址总线 AB,输 入 设 备,CPU,寄存器,存储器,I/O端口,数据传送是最基本、最重要的一种操作 实际程序中,使用的比例最高,change PROC LEA SI, num+2 MOV CL, num+1 MOV CH, 0 MOV AX, 0 MOV DI, 10 next: MUL DI MOV BH, 0 MOV BL, SI AND BL, 0FH ADD AX, BX INC SI LOOP next zero: MOV BX, AX RET change ENDP,汇编子程例:,特点: 1. 除POPF、SAHF外,其他传送指令对标志位均无影响 2. 唯一允许以段寄存器做操作数的指令 且只有MOV、PUSH、POP这三条允许,1. 通用传送指令 MOV、PUSH、POP、XCHG、XLAT,reg/mem/segreg reg reg/segreg mem reg/mem segreg reg/mem data,可实现,1)MOV传送指令 格式 MOV dst,src 执行 ( dst ) ( src ),例 : reg/mem/segreg reg 通用寄存器/存储器/段寄存器通用寄存器 MOV AL , BL MOV BX , AL MOV DS , AX reg/segreg mem 通用寄存器/段寄存器 存储器 MOV AL , BX MOV DS , BX+SI reg/mem segreg 通用寄存器/存储器 段寄存器 MOV BX , CS MOV BX , DS reg/mem data 通用寄存器/存储器 立即数 MOV Al , 9 MOV BX , OFFSET buffer MOV value , 0 MOV WORD PTR BX , 1,MOV指令特点及注意事项: 双操作数指令 (注意双操作指令的特点) 可进行字节或字传送 不允许存储器传送到存储器 MOV BX , value MOV DI, SI MOV AX ,value MOV BX ,AX MOV AL ,SI MOV DI ,AL,可对 DS、ES、SS 赋值 但不允许立即数直接传送给段寄存器 MOV DS,AX MOV ES ,BX MOV DS,1000H MOV AX ,1000H MOV DS,AX CS不能做目的操作数, 不能通过传送指令改变CS的值 MOV CS , AX,D:MASMDEBUG -A 1693:0100 MOV ES, DS Error 1693:0100 MOV AX, DS 1693:0102 MOV ES, AX 1693:0104 -,例 编程将CL寄存器的内容传送到200:100H单元中。,课外作业: 编写程序段,将内存200:100H开始的一个字内容 传送到地址为800:400H开始的内存中。,MOV 200:100H , CL,2)PUSH入栈操作 格式 PUSH src 执行 ( SP) (SP)- 2 (SS:SP) (src),特点: 单操作数指令 操作数为16位,可以是reg/segreg/mem, 不可以是data reg : AX, BX, CX, DX, SI, DI, BP, BX segreg : CS, DS, ES, SS mem : 字类型,例: PUSH AX,不变 减2 变 不变,3)POP出栈操作,特点: 单操作数指令 操作数为16位,可以是reg/segreg/mem, 不可以是data reg : AX, BX, CX, DX, SI, DI, BP, BX segreg : DS, ES, SS, 不允许是CS mem : 字类型,例: POP BX,不变 加2 变 变,堆栈的概念 stack,堆栈操作指令 PUSH 和 POP, 对 SS 和 SP 指向的内存单元, 以“后进先出”方式进行操作。 PUSH 入栈操作 SP减小 POP 出栈操作 SP增加 SP 指向栈顶,即堆栈的顶部, 编程员通过设置堆栈区域, 利用堆栈操作,可方便的进行数据的存放和恢复。,堆栈使用的场合 用堆栈保存恢复信息 (如上例) 子程序的调用、返回以及中断调用、返回 (控制转移指令中介绍) 用堆栈传送数据 (程序设计中介绍),4)XCHG交换指令(自学) 格式 XCHG oprd1,oprd2 执行 (oprd1) (oprd2),例 XCHG AX, BX 字操作 执行前(AX)= 1122H (BX)= 3344H 执行后(AX)= 3344H (BX)= 1122H 例 XCHG AH, BL 字节操作 执行前(AX)= 1122H (BX)= 3344H 执行后(AX)= 4422H (BX)= 3311H,XCHG oprd1,oprd2 注意事项: 双操作数指令 可进行字或字节操作 不允许对立即数、段寄存器做操作数 XCHG AX, 4 XCHG BX, DS,2. 地址传送指令LEA、LDS、LES,LEA有效地址传送 格式 LEA reg, mem 执行 (reg) mem的EA 即 寄存器 存储器操作数的偏移地址,执行后 ( BX ) = 1000H,注意: OFFSET是汇编程序提供的一个操作符,不是CPU的指令,LEA BX, buffer,等价于 MOV BX ,OFFSET buffer,MOV AX, SEG buffer MOV DS, AX LEA BX, buffer MOV CX, 4 MOV AL, 0 exit: ADD AL, BX INC BX DEC CX ;(cx) =(cx) -1 JNZ exit ;ZF 0, 转至exit,说明: 1) 操作符SEG 的作用是取变量的段地址。 执行完前两条指令后,(DS)=buffer的段值 2) 操作符OFFSET的作用是取变量的偏移地址 执行完LEA BX, buffer, (BX)为buffer的偏移地址, 3)操作数 BX是以DS为段值,BX为偏移值的内存单元,3. 标志传送 PUSHF、POPF、 LAHF、SAHF,三. 算术运算指令,指令分类:,特点: 带符号数用补码表示 如 MOV AX, -1 等价于 MOV AX, 0FFFFh 对加、减运算,不区分无符号数、带符号数 (参见第一章例) 对乘、除运算,区分无符号数、带符号数 可进行字节或字操作 影响状态标志 十进制运算方法 (不做重点,讲义中做了简单介绍) 当数据用压缩或非压缩BCD码表示时, 为使运算的结果仍为BCD码表示,需对结果进行调整。 十进制运算 = 二进制运算 + 十进制调整,BCD码( Binary Coded Decimal ) 用二进制编码表示十进制数。 常用8421 BCD码, 与十进制数码对应关系:,例 48的BCD码为 ( 0100 1000)BCD,根据在内存的存放形式,分压缩BCD码和非压缩 BCD码 1) 压缩BCD码 一字节存放2个BCD码。 如 2148 的压缩BCD码为: ( 0010 0001 0100 1000 )压缩BCD 在内存中占2字节 2) 非压缩 BCD码 一字节存放1个BCD码。 如 2148 的非压缩BCD码为: ( 00000010 00000001 00000100 00001000 ) 非压缩BCD 在内存中占4字节,当数据用压缩或非压缩BCD码表示时, 为使运算的结果仍为BCD码表示,需对结果进行调整。 十进制运算 = 二进制运算 + 十进制调整,例 (0000 1000 ) 压缩BCD + (0000 1001) 压缩BCD = (0001 0111 ) 压缩BCD,1. 加法运算指令,ADD、ADC为双操作数指令 INC为单操作数指令 除INC指令不影响CF外,6个状态标志均据结果设置,ADC带进位加法,实现字以上运算,例1 编程完成 CFA1H + 62A0H (做过的随堂作业),MOV DX,0CFA1H ADD DX,62A0H,执行后: (DX)=3241H CF=1,OF=0,SF=0, ZF=0 (注意CF和OF的判断方法),三组指令执行后的结果均为: (AL)=0FDH, CF=0, OF=0, SF=1, ZF=0,第一章中的例题,对加、减运算,CPU计算时不区分无符号数、带符号数,例2 INC AL 执行前 (AL)= FFH,执行后: (AL)=00H CF=不变,OF=0,ZF=1,SF=0,注意是内存单元内容加1,而非地址加1,INC value 或写成: INC value,若编程如下, MOV CX, 4 MOV AL, 0 exit: ADD AL, buffer INC buffer DEC CX JNZ exit,不能实现, 为什么?,. MOV CX, 4 LEA BX, buffer MOV AL, 0 exit: ADD AL, BX INC BX DEC CX JNZ exit,实现的是1A+1B+1C+1D 指令INC buffer 将buffer指向的内容加1, 而不是地址buffer加1,例5 两双字相加 0002F365H + 0005 E024 H = ?,MOV AX,0F365H ADD AX,0E024H MOV BX,0002H ADC BX,0005H ,执行完、:(AX)= D389H CF=1, OF=0, SF=1, ZF=0 执行完、:(BX)= 0008H CF=0, OF=0, SF=0, ZF=0,分析: 8086/8088只能按字节或字相加。 位数在字以上的操作数,先加低位,再加高位, 加高位时加入从低位产生的进位。,2. 减法运算指令,SUB、SBB、 CMP为双操作数,DEC、NEG为单操作数 SBB为带进位减法 除DEC不影响CF标志外,6个状态标志均据结果置位 NEG求补运算,等价于用0减去操作数。 其对标志位的影响,由0减去该操作数的过程决定。,例1 编程完成 2D04H 3AB0H,执行后: (AX)=0F254H CF=1,OF=0,SF=1,ZF=0,MOV AX ,2D04H SUB AX ,3AB0H,借位,例2 value 是一个字节变量 OFFSET value = 1000H (DS)=2000H,(21000H)=00H DEC value 执行后:(21000H)=0FFH CF=不变,OF=0,ZF=0,SF=1,注意是内存单元内容减1,而非地址减1,例3 MOV AH, 80H NEG AH,执行后: (AL)=80H CF=1,OF=1,ZF=0,SF=1,例4 用指令完成两双字相减运算,MOV AX,7A70H SUB AX,A543H MOV BX,0546H SBB BX,0F001H,CMP oprd1, oprd2
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号