汇编语言(三)-8086的寻址方式

1. 与数据有关的寻址方式

1.1 概述

确定操作数地址从而找到操作数
8086的指令格式
在这里插入图片描述
在这里插入图片描述

1.2 寻址方式

  1. 立即寻址
    数据在指令内以立即数形式存在

可以8位数据,也可以16位数据

注意:立即数的表数范围
MOV AX,1234H;MOV BL,07H ✔
MOV AX,70000;MOV BL,325

立即寻址不可以是DST操作数

  1. 寄存器寻址
    数据在指令指定的寄存器

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

立即寻址和寄存器寻址均不访存

  1. 直接寻址
    指令给出操作数的有效偏移地址(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 ]

—后面四种寻址方式均为直接寻址的特殊形式—

  1. 寄存器间接寻址
    指令指定的寄存器内为操作数的有效偏移地址

基地址放在BXBP
变地址( 索引地址 )放在SIDI
MOV AX,[ BX ];MOV BL,[ SI ] ✔
MOV AX,[ CX ] ✖ (不允许其他计算器)

寄存器BXSIDI对应数据段DS
寄存器BP对应堆栈段SS
物理地址 = ( DS )×16 + ( BX ) 或 ( SI ) 或 ( DI )
物理地址 = ( SS )×16 + ( BP )

  1. 寄存器相对寻址
  • 在寄存器间址的基础上,再加上相对偏移量(可正可负补码

例:假设(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 ]

相对量的数位,汇编时完成位数扩展
适于数组、字符串等连续存储区的数据处理
在这里插入图片描述

  1. 基址变址寻址
    由指定的基址寄存器变址寄存器组合出有效偏移地址

基地址寄存器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 ] ✖ (必须一个基址一个变址

  1. 相对基址变址寻址
    完备的一种地址生成模式

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 寻址方式

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

JMP SHORT TABLE
JMP NEAR PTR TABLE

  1. 段内间接寻址
    段基址不变,用其它的寻址方式给定一个16位地址值

JMP BX(BX→IP)
JMP WORD PTR TABLE[ BP ]

注意:立即寻址不允许使用

  1. 段间直接寻址
    给出的符号地址与跳转指令不在一个段内,段基址需要改变

JMP FAR PTR TABLE
TABLE对应的段基址→CS
TABLE对应的偏移地址→IP

  1. 段间间接寻址
    用寻址方式找出一个双字,低位放入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 串的指令

  1. 串传送指令
    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

不影响标志位

  1. 串取出指令
    LODS SRC(SRC默认 [ DS:SI ])
    LODSB (AL←[SI] (SI)←(SI)±1)
    LODSW (AX←[SI] (SI)←(SI)±2)

  2. 串存入指令
    STOS DST(DST默认 [ ES:DI ])
    STOSB ([DI]←AL (DI)←(DI)±1)
    STOSW ([DI]←AL (DI)←(DI)±1)

注意: 两种特殊的存储器和寄存器之间单向传送
不影响标志位

  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

  2. 串扫描指令
    SCAS DST(DST逐次和累加器比较)
    SCASB AL-[DI] (DI)←(DI)±1
    SCASW AX-[DI] (DI)←(DI)±2

根据运算结果置标志位
不保存运算结果

  1. 重复前缀
    REP 串指令;MOVS 或 LODS、STOS

执行过程:
a、执行其后指令
b、(CX) -1←(CX)
c、如(CX)≠0,则返回a;否则退出(后续指令)

执行之前要求
a、源串指针(SI),目的串指针(DI)
b、计数值CX
c、方向DF标志位

在这里插入图片描述
在这里插入图片描述

  1. 重复前缀( 需判断标志 )
    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 无条件跳转指令

实现不同程序段的衔接

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

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

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

  1. 段内间接转移
    JMP WORD PTR OPR

在这里插入图片描述

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

在这里插入图片描述

  1. 段间直接转移
    JMP FAR PTR OPR

在这里插入图片描述

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

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

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

  1. 段间间接转移
    JMP DWORD PTR OPR

在这里插入图片描述

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

必须是主存寻址模式

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

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

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

4.2 有条件跳转指令

注意:只能使用段内直接寻址的8位位移量

JXX OPR

  1. 判断单个条件标志
    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

  2. 比较两个无符号的关系
    大于 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不可能同时有效

  3. 比较两个有符号的关系
    大于 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)

在这里插入图片描述

  1. JCXZ OPR
    当(CX)=0时,跳转(可替代指令)

4.3 循环控制指令

  1. LOOP OPR
    只能使用段内直接寻址的8位位移量
    CX作为循环计数

执行过程
a、(CX) -1 → (CX)
b、如(CX)≠0,则跳转;否则退出(后续指令)

在这里插入图片描述

注意:LOOP指令放在循环体最后,之前设置CX数值
思考:该指令是否可以替代

  1. (带标志位)
    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 子程序调用

  1. 段内直接调用
    CALL OPR

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

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

  1. 段内间接调用
    CALL OPR

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

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

  1. 段间直接调用
    CALL FAR PTR OPR

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

  1. 段间间接调用
    CALL DWORD PTR OPR

Push CS,(CS) ← ( OPR形成的EA+2 )
Push IP,(IP) ← ( OPR形成的EA )

立即寻址、直接寻址、寄存器寻址不允许—

  1. 子程序返回指令
    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:N
    4 ]

  • IRET
    Pop IP
    Pop CS
    Pop PSW

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
汇编语言中的table指的是将data段中的数据按照指定格式写入到table段中的操作。在此过程中,还需要计算出21年的人均收入并将结果以指定格式保存到table段中。 具体实现的步骤如下: 1. 首先,需要定义并初始化data段中的数据。根据引用所述,data段可以分为大块,包括字节型数据、double word 类型数据和字类型数据。根据题目给出的数据格式,需要将这些数据按照指定格式写入到table段中。 2. 接下来,需要编写汇编代码来实现将data段中的数据写入到table段中的功能。可以使用循环来遍历data段中的每个元素,并将其按照指定格式写入到table段中。 3. 在写入数据的同时,还需要计算21年的人均收入。根据题目给出的数据格式,可以根据需要的计算方式来计算人均收入,并将结果保存到table段中。 总结:汇编语言中的table是指将data段中的数据按照指定格式写入到table段中,并计算21年的人均收入并保存到table段中的操作。具体实现可以通过定义和初始化data段中的数据,编写相应的汇编代码来实现。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [汇编语言:实验七 寻址方式在结构化数据访问中的应用](https://blog.csdn.net/Genius_bin/article/details/120167383)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [汇编语言王爽第八章实验7.asm](https://download.csdn.net/download/qq_41955402/12149404)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值