汇编语言(三) |
您所在的位置:网站首页 › 汇编语言的指令格式为 › 汇编语言(三) |
8086的寻址方式
1. 与数据有关的寻址方式1.1 概述1.2 寻址方式1.3 小结
2. 与转移地址有关的寻址2.1 概述2.2 寻址方式
3. 连续存储器操作(串指令)3.1 串的概念3.2 串的指令
4. 跳转指令4.1 无条件跳转指令4.2 有条件跳转指令4.3 循环控制指令4.4 子程序调用4.5 中断调用
1. 与数据有关的寻址方式
1.1 概述
确定操作数地址从而找到操作数 8086的指令格式 可以8位数据,也可以16位数据 注意:立即数的表数范围 MOV AX,1234H;MOV BL,07H ✔ MOV AX,70000;MOV BL,325 ✖ 立即寻址不可以是DST操作数 寄存器寻址 数据在指令指定的寄存器内8位寄存器 AH、AL、BH、BL、CH、CL、DH、DL 16位寄存器 AX、BX、CX、DX、SI、DI 注意:前后操作数数位匹配 MOV AX,BX;MOV CH,AL ✔ MOV AX,BL;MOV CH,DX ✖ CS不可以是DST操作数 MOV CS,DX ✖ 谨慎操作 DS、SS、ES、IP、SP、BP 立即寻址和寄存器寻址均不访存 直接寻址 指令给出操作数的有效偏移地址(16位的无符号数) 和数据区分,地址书写加 [ ] MOV AX,[ 1000H ] MOV BL,[ 07H ]默认的是数据段DS 主存数据操作满足高高低低原则 汇编后对应具体的偏移地址 支持重定位操作 不允许双操作数均为直接寻址,至少一个是寄存器 MOV [ 1000H ],[ 07H ] ✖ —后面四种寻址方式均为直接寻址的特殊形式— 寄存器间接寻址 指令指定的寄存器内为操作数的有效偏移地址基地址放在BX或BP中 变地址( 索引地址 )放在SI或DI中 MOV AX,[ BX ];MOV BL,[ SI ] ✔ MOV AX,[ CX ] ✖ (不允许其他计算器) 寄存器BX、SI、DI对应数据段DS 寄存器BP对应堆栈段SS 物理地址 = ( DS )×16 + ( BX ) 或 ( SI ) 或 ( DI ) 物理地址 = ( SS )×16 + ( BP ) 寄存器相对寻址 在寄存器间址的基础上,再加上相对偏移量(可正可负补码)例:假设(SI)=3,则 MOV AL,M[ SI ] 或 MOV AL, [ M+SI ](符号名即相对位置) 物理地址 = ( DS )×16 + ( BX ) 或 ( SI ) 或 ( DI ) + 相对量 物理地址 = ( SS )×16 + ( BP ) + 相对量 相对量也可以正负数形式出现MOV AL,+1[ BX ];MOV AL,-2[ BX ] 或 MOV AL, [ BX+1 ];MOV AL, [ BX-2 ] 相对量的数位,汇编时完成位数扩展 适于数组、字符串等连续存储区的数据处理 基地址寄存器BX、BP 变地址寄存器SI、DI 物理地址 = ( DS )×16 + ( BX ) + ( SI ) 或 ( DI ) 物理地址 = ( SS )×16 + ( BP ) + ( SI ) 或 ( DI ) MOV AL,[ BX ][ BP ] ✖ (必须一个基址一个变址) 相对基址变址寻址 最完备的一种地址生成模式MOV AL,Table[ BX ][ SI ] 或 MOV AL, [ Table+BX+SI ] 物理地址 = ( DS )×16 + ( BX ) + ( SI ) 或 ( DI ) + 相对量 物理地址 = ( SS )×16 + ( BP ) + ( SI ) 或 ( DI ) + 相对量 适于二维数组的数据处理 1.3 小结注意:8086仅支持这7种寻址方式 转移类指令的格式 JMP SHORT TABLE JMP NEAR PTR TABLE 段内间接寻址 段基址不变,用其它的寻址方式给定一个16位地址值JMP BX(BX→IP) JMP WORD PTR TABLE[ BP ] 注意:立即寻址不允许使用 段间直接寻址 给出的符号地址与跳转指令不在一个段内,段基址需要改变JMP FAR PTR TABLE TABLE对应的段基址→CS TABLE对应的偏移地址→IP 段间间接寻址 用寻址方式找出一个双字,低位放入IP,高位放入CSJMP DWORD PTR [ SI ] 注意:立即寻址、寄存器寻址、直接寻址不允许使用 3. 连续存储器操作(串指令) 3.1 串的概念 一段连续的存储区称为串( String )注意: 隐含默认寻址方式,仅两种写法 MOVS ES: BYTE PTR [DI],DS:[SI] MOVS ES: WORD PTR [DI],DS:[SI] 短格式缩略写法 MOVSB [DI]←[SI] (SI)←(SI)±1 (DI)←(DI)±1 MOVSW [DI]←[SI] (SI)←(SI)±2 (DI)←(DI)±2 不影响标志位 串取出指令 LODS SRC(SRC默认 [ DS:SI ]) LODSB (AL←[SI] (SI)←(SI)±1) LODSW (AX←[SI] (SI)←(SI)±2) 串存入指令 STOS DST(DST默认 [ ES:DI ]) STOSB ([DI]←AL (DI)←(DI)±1) STOSW ([DI]←AL (DI)←(DI)±1) 注意: 两种特殊的存储器和寄存器之间单向传送 不影响标志位 串比较指令 CMPS OPR1,OPR2(默认 [ DS:SI ]和[ ES:DI ]) CMPSB [SI]-[DI] (SI)←(SI)±1 (DI)←(DI)±1 CMPSW [SI]-[DI] (SI)←(SI)±2 (DI)←(DI)±2 串扫描指令 SCAS DST(DST逐次和累加器比较) SCASB AL-[DI] (DI)←(DI)±1 SCASW AX-[DI] (DI)←(DI)±2 根据运算结果置标志位 不保存运算结果 重复前缀 REP 串指令;MOVS 或 LODS、STOS执行过程: a、执行其后指令 b、(CX) -1←(CX) c、如(CX)≠0,则返回a;否则退出(后续指令) 执行之前要求 a、源串指针(SI),目的串指针(DI) b、计数值CX c、方向DF标志位
REPE / REPZ 执行过程 a、执行其后指令,置标志位, (CX) -1→(CX) b、如(CX)≠0 且ZF=1,返回a继续;否则退出 注意: 可能没有执行完设定的次数,最少一次即退出 REPNE / REPNZ 执行过程 a、执行其后指令,置标志位, (CX) -1 →(CX) b、如(CX)≠0且ZF=0,返回a继续;否则退出 实现不同程序段的衔接 段内直接转移 JMP SHORT OPR JMP NEAR PTR OPR
汇编后为相对偏移量(补码) (对程序重定位的支持) 短跳:8位偏移量(-128~127) 长跳:16位偏移量(-32768~32767) 段内间接转移 JMP WORD PTR OPR指定寻址方式找到一个字 → IP 不允许立即寻址 提供编程的灵活性,仅无条件转移适用 不在一个段的符号地址,必须标成FAR属性 目的地址的段基址 → CS 目的地址的偏移地址 → IP 注意:不同的跳转模式,OPR所占的位数不同 段间间接转移 JMP DWORD PTR OPR指定寻址方式需找到一个双字 双字的高字 → CS 双字的低字 → IP 必须是主存寻址模式 注意:8086的寄存器寻址最多能得到16位数据 思考:系统如何区分直接方式还是间接方式 直接转移方式的指令格式示意 JMP SHORT OPR JMP NEAR PTR OPR JMP FAR PTR OPR
注意:只能使用段内直接寻址的8位位移量 JXX OPR 判断单个条件标志 JZ / JE OPR:ZF = 1 JNZ / JNE OPR:ZF = 0 JS OPR / JNS OPR:判断SF JO OPR / JNO OPR:判断OF JP OPR / JNP OPR:判断PF JC OPR / JNC OPR:判断CF 比较两个无符号的关系 大于 Above;小于 Below;等于 Equal(X - Y) X > Y JA / JNBE OPR:CF∨ZF = 0(CF = 0 且 ZF = 0) X ≥ Y JAE / JNB OPR:CF = 0 即 JNC X < Y JB / JNAE OPR:CF = 1 即 JC X ≤ Y JBE / JNA OPR:CF∨ZF = 1(CF = 1 或 ZF = 1) CF和ZF不可能同时有效 比较两个有符号的关系 大于 Greater;小于 Less;等于 Equal(X - Y) X > Y JG / JNLE OPR:(SF∀OF)∨ZF = 0(SF∀OF = 0 且 ZF = 0) X ≥ Y JGE / JNL OPR:SF∀OF = 0 X < Y JL / JNGE OPR:SF∀OF = 1 X ≤ Y JLE / JNG OPR:(SF∀OF)∨ZF = 1(SF∀OF = 1 或 ZF = 1) 执行过程 a、(CX) -1 → (CX) b、如(CX)≠0,则跳转;否则退出(后续指令) 注意:LOOP指令放在循环体最后,之前设置CX数值 思考:该指令是否可以替代 (带标志位) LOOPZ / LOOPE OPR LOOPNZ / LOOPNE OPR执行过程 a、(CX) -1 → (CX) LOOPZ / LOOPE: b、如(CX)≠0 且 ZF=1 ,则跳转;否则退出(后续指令) LOOPNZ / LOOPNE b、如(CX)≠0 且 ZF=0 ,则跳转; 注意: 可能没有执行完CX设定的次数即退出 4.4 子程序调用 段内直接调用 CALL OPRPush IP;(IP) ←(IP) +相对偏移 子程序名称就是跳转的符号地址 没有8位偏移量的短跳转 段内间接调用 CALL OPRPush IP;(IP)← ( OPR形成的EA ) —立即寻址、直接寻址不允许— CALL BX CALL TABLE[SI] 段间直接调用 CALL FAR PTR OPRPush CS,(CS) ← OPR对应的段基址 Push IP,(IP) ← OPR对应的段内偏移 调用时子程序名称必须有FAR属性 段间间接调用 CALL DWORD PTR OPRPush CS,(CS) ← ( OPR形成的EA+2 ) Push IP,(IP) ← ( OPR形成的EA ) —立即寻址、直接寻址、寄存器寻址不允许— 子程序返回指令 RET < EXP >必须放在子程序中,通常放在子程序末尾 段内返回 Pop IP 段间返回 Pop IP,Pop CS < EXP > 为计算表达式 需要时可以加注 (SP) ← (SP) +表达式数值 注意:CALL指令和JMP指令的异同 4.5 中断调用特殊的段间间接跳转,中断程序由系统提供 INT TYPE INTO IRET TYPE是类型号,8位立即数形式(0~255) INTO是溢出中断 INT执行后,IF和TF自动置0 INT TYPE Push PSW(调用程序和中断程序不共用PSW) Push CS Push IP (CS) ← [ 0000:N4+2 ] (IP) ← [ 0000:N4 ] IRET Pop IP Pop CS Pop PSW |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |