汇编语言(三)

您所在的位置:网站首页 汇编语言的指令格式为 汇编语言(三)

汇编语言(三)

2024-07-17 13:09| 来源: 网络整理| 查看: 265

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的指令格式 在这里插入图片描述 在这里插入图片描述

1.2 寻址方式 立即寻址 数据在指令内以立即数形式存在

可以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 AX,M MOV BL,N

汇编后对应具体的偏移地址 支持重定位操作 在这里插入图片描述 允许段跨越,在偏移地址前标明跨越的段 MOV AX,ES:[ 1000H ] MOV BL,CS:[ 07H ]

不允许双操作数均为直接寻址,至少一个是寄存器 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 在这里插入图片描述 MOV AL,[ BX ][ SI ] 或 MOV AL, [ BX+SI ]

物理地址 = ( 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种寻址方式 在这里插入图片描述

2. 与转移地址有关的寻址 2.1 概述

转移类指令的格式 在这里插入图片描述 注意:相对量位数决定转移的范围 8位偏移量(-128~127) 16位偏移量(-32768~32767)

2.2 寻址方式 段内直接寻址 段基址不变,指令直接给出地址相对偏移量(补码)

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,高位放入CS

JMP DWORD PTR [ SI ]

注意:立即寻址、寄存器寻址、直接寻址不允许使用

3. 连续存储器操作(串指令) 3.1 串的概念 一段连续的存储区称为串( String )

在这里插入图片描述

串指令的默认方式 a、隐含寻址 源:[DS:SI];目的:[ES:DI] b、方向标志 DF=0时,DI、SI递增;DF=1时,DI、SI递减 c、总个数 CX计数 3.2 串的指令 串传送指令 MOVS DST,SRC

注意: 隐含默认寻址方式,仅两种写法 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 串指令;CMPS 、SCAS REPNE / REPNZ 串指令

REPE / REPZ 执行过程 a、执行其后指令,置标志位, (CX) -1→(CX) b、如(CX)≠0 且ZF=1,返回a继续;否则退出

注意: 可能没有执行完设定的次数,最少一次即退出

REPNE / REPNZ 执行过程 a、执行其后指令,置标志位, (CX) -1 →(CX) b、如(CX)≠0且ZF=0,返回a继续;否则退出

在这里插入图片描述

4. 跳转指令 4.1 无条件跳转指令

实现不同程序段的衔接

段内直接转移 JMP SHORT OPR JMP NEAR PTR OPR

在这里插入图片描述 编程时用符号地址

汇编后为相对偏移量(补码) (对程序重定位的支持) 短跳:8位偏移量(-128~127) 长跳:16位偏移量(-32768~32767)

段内间接转移 JMP WORD PTR OPR

在这里插入图片描述

指定寻址方式找到一个字 → IP 不允许立即寻址 提供编程的灵活性,仅无条件转移适用

在这里插入图片描述

段间直接转移 JMP FAR PTR OPR

在这里插入图片描述

不在一个段的符号地址,必须标成FAR属性

目的地址的段基址 → CS 目的地址的偏移地址 → IP

注意:不同的跳转模式,OPR所占的位数不同

段间间接转移 JMP DWORD PTR OPR

在这里插入图片描述

指定寻址方式需找到一个双字 双字的高字 → CS 双字的低字 → IP

必须是主存寻址模式

注意:8086的寄存器寻址最多能得到16位数据 思考:系统如何区分直接方式还是间接方式

直接转移方式的指令格式示意 JMP SHORT OPR JMP NEAR PTR OPR JMP FAR PTR OPR

在这里插入图片描述 相对偏移量直接在指令地址码 (以立即补码形式提供)

4.2 有条件跳转指令

注意:只能使用段内直接寻址的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)

在这里插入图片描述

JCXZ OPR 当(CX)=0时,跳转(可替代指令) 4.3 循环控制指令 LOOP OPR 只能使用段内直接寻址的8位位移量 用CX作为循环计数

执行过程 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 OPR

Push IP;(IP) ←(IP) +相对偏移

子程序名称就是跳转的符号地址 没有8位偏移量的短跳转

段内间接调用 CALL OPR

Push IP;(IP)← ( OPR形成的EA )

—立即寻址、直接寻址不允许— CALL BX CALL TABLE[SI]

段间直接调用 CALL FAR PTR OPR

Push CS,(CS) ← OPR对应的段基址 Push IP,(IP) ← OPR对应的段内偏移 调用时子程序名称必须有FAR属性

段间间接调用 CALL DWORD PTR OPR

Push 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