找回密码
 register

QQ登录

只需一步,快速开始

查看: 36|回复: 0

[汇编语言] [零基础入门学习]·23·[BX]和loop指令·[BX]

[复制链接]

[汇编语言] [零基础入门学习]·23·[BX]和loop指令·[BX]

[复制链接]
  • 打卡等级:热心大叔
  • 打卡总天数:91
  • 打卡月天数:14
  • 打卡总奖励:91
  • 最近打卡:2025-01-15 02:59:34
Waylee

主题

0

回帖

1万

积分

仙帝

积分
11890
Waylee 2025-1-1 21:36 | 显示全部楼层 |阅读模式 | Google Chrome | Windows 10

马上注册,查看网站隐藏内容!!

您需要 登录 才可以下载或查看,没有账号?register

×

第5章 [BX]和loop指令

一、[bx]和内存单元的描述

[bx]是什么呢?和[0]有些类似,[0]表示内存单元,它的偏移地址是0。比如在下面的指令中(在Debug中使用):
mov ax,[0]
将一个内存单元的内容送入ax,这个内存单元的长度为2字节(字单元),存放一个字,偏移地址为0,段地址在ds中。
mov al,[0]
将一个内存单元送入al,这个内存单元的长度为1字节(字节单元),存放一个字节,偏移地址为0,段地址在ds中。

要完整地描述一个内存单元,需要两种信息:①内存单元的地址;②内存单元的长度(类型)。
用[0]表示一个内存单元时,0表示单元的偏移地址,段地址默认在ds中,单元的长度(类型)可以由具体指令中的其他操作对象(比如说寄存器)指出。

[bx]同样也表示一个内存单元,它的偏移地址在bx中,比如下面的指令:
mov ax,[bx]
将一个内存单元的内容送入ax,这个内存单元的长度为2字节(字单元),存放一个字,偏移地址在bx中,段地址在ds中。
mov al,[bx]
将一个内存单元的内容送入al,这个内存尿胆原的长度为1字节(字节单元),存放一个字节,偏移地址在bx中,段地址在ds中。

二、Loop

英文单词“loop”有循环的含义,显然这个指令和循环有关。
我们在这一章,讲解[bx]和loop指令的应用、意义和相关的内容。

三、我们定义的描述性符号:“()”

为了描述上的简洁,在以后的课程中,我们将使用一个描述性的符号“()”来表示一个寄存器或一个内存单元中的内容。比如:
(ax)表示ax中的内容、(al)表示al中的内容;
(20000H)表示内存20000H单元的内容(()中的内存单元的地址为物理地址);

((ds)*16+(bx))表示:
ds中的内容为ADR1bx的内容为ADR2,内存 ADR1*16+ADR2单元的内容。
也可以理解为:ds中的ADR1作为段地址,bx中的ADR2作为偏移地址,内存ADR1:ADR2单元的内容。

注意,“()”中的元素可以有3中类型:①寄存器名;②段寄存器名;③内存单元的物理地址(一个20位数据)。比如:
(ax)、(ds)、(al)、(cx)、(20000H)、((ds)*16+(bx))等是正确的用法;
(2000:0)、((ds):1000H)等是不正确的用法。

我们看一下(X)的应用,比如,

  1. ax的内容为0010H,可以这样来描述:(ax)=0010H;
  2. 2000:1000处的内容为0010H,可以这样来描述:(21000H)=0010H;
  3. 对于 mov ax,[2]的功能,可以这样来描述:(ax)=((ds)*16+2);
  4. 对于mov [2],ax的功能,可以这样来描述:((ds)*16+2)=(ax)
  5. 对于add ax,2的功能,可以这样俩描述:(ax)=(ax)+2;
  6. 对于add ax,bx的功能,可以这样来描述(ax)=(ax)+(bx);
  7. 对于push ax的功能,可以这样来描述:
    • (sp)=(sp)-2
    • ((sp)*16+(sp))=(ax)
  8. 对于pop ax的功能,可以这样来描述:
    • (ax)=((ss)*16+(sp))
    • (sp) = (sp)+2

"X"所代表的数据有两种类型:①字节;②字。是哪种类型由寄存器名和具体的运算决定,比如:
(al)、(bl)、(cl)等得到的数据为字节型;(ds)、(ax)、(bx)等得到的数据为字型。

(al)=(20000H),则(20000H)得到的数据为字节型;(ax)=(20000H),则(20000H)得到的数据为字型。

四、约定符号 idata表示常量

我们在Debug中写过类似的指令:mov ax,[0],表示将ds:0处的数据送入ax中。指令中,在“[...]”里面用一个常量0表示内存地址单元的偏移地址。以后,我们用idata表示常量。比如:
mov ax,[idata]就代表mov ax,[1]、mov ax,[2]、mov ax,[3]等。
mov bx,idata 就代表 mov bx,1、mov bx,2、mov bx,3 等
mov ds,idata,就代表mov da,1、mov ds,2等,它们都是非法指令。

5.1 [BX]

看一看下面指令的功能。
mov ax,[bx]
功能:bx中存放的数据作为一个偏移地址EA,段地址SA默认在ds中,将SA:EA处的数据传入ax中。即:(ax)=((ds)*16+(bx))
mov [bx],ax
功能:bx中存放的数据作为一个偏移地址EA,段地址SA默认在ds中,将ax中的数据送入内存SA:EA处,即:((ds)*16+(bx))=(ax)

问题5.1

程序和内存中的情况如图5.1所示,写出程序执行后,21000H~21007H单元的内容。

10.webp

思考后看分析。

注意,inc bx的含义是bx中的内容加1,比如下面两条指令:

mov bx,1
inc bx

执行后,bx=2。

分析:

(1) 先看一下程序的前3条指令:

mov ax,2000H
mov ds,ax
mov bx,1000H

这3条指令执行后,ds=2000H,bx=1000H。

(2)接下来,第4条指令:
mov ax,[bx]
指令执行前:ds=2000H,bx=1000H,则mov ax,[bx]将把内存2000:1000处的字型数据送入ax中。该指令执行后,ax=00beH。

(3)接下来,第5、6条指令:

inc bx
inc bx

这两条指令执行前bx=1000H,执行后bx=1002H。

(4)接下来,第7条指令:
mov [bx],ax
指令执行前:ds=2000H,bx=1002H,则mov [bx],ax 将把ax的数据送入内存2000:1002处。指令执行后,2000:1002单元的内容为BE,2000:1003单元的内容为00。

(5)接下来,第8、9条指令:

inc bx
inc bx

这两条指令执行前bx=1002H,执行后bx=1004H。

(6)接下来,第10条指令:
mov [bx],ax
指令执行前:ds=2000H,bx=1004H,则mov [bx],ax 将把ax中的数据送入内存2000:1004处。指令执行后,2000:1004单元的内容为be,2000:1005单元的内容为00。

(7)接下来,第11条指令:
inc bx
这条指令执行前bx=1004H,执行后bx=1005H。

(8)接下来,第12条指令:
`mov [bx],al
指令执行前:ds=2000H,bx=1005H,则mov [bx],al 将把al中的数据送入内存2000:1005处。指令执行后,2000:1005单元的内容为BE。

(9)接下来执行,第13条指令:
inc bx
这条指令执行前bx=1005H,执行后bx=1006H。

(10)接下来,第14条指令:
mov [bx],al
指令执行前:ds=2000H,bx=1006H,则mov [bx],al将把al中的数据送入内存2000:1006处。指令执行后,2000:1006单元的内容为BE。
程序执行后,内存的情况如图5.2所示。

100.webp

您需要登录后才可以回帖 登录 | register

本版积分规则

雪舞知识库 | 浙ICP备15015590号-1 | 萌ICP备20232229号|浙公网安备33048102000118号 |天天打卡

GMT+8, 2025-1-15 13:26 , Processed in 0.107301 second(s), 8 queries , Redis On.

Powered by XueWu Licensed

Copyright © Tencent Cloud.

快速回复 返回顶部 返回列表