zoukankan      html  css  js  c++  java
  • [BX]和loop指令01 零基础入门学习汇编语言23

    第五章:[BX]和loop指令01

     

    让编程改变世界

    Change the world by program


     

    [bx]和内存单元的描述

     

    [bx]是什么呢?

    和[0]有些类似,[0]表示内存单元,它的偏移地址是0。

    mov ax, [0]

    mov al, [0]

    我们要完整地描述一个内存单元,需要两种信息:

    内存单元的地址;

    内存单元的长度(类型)。

      我们用[0]表示一个内存单元时,0 表示单元的偏移地址,段地址默认在ds中,单元的长度(类型)可以由具体指令中的其他操作对象(比如说寄存器)指出,如前边的AX,AL。 [bx]同样也表示一个内存单元,它的偏移地址在bx中,比如下面的指令:

    mov ax,[bx]

    mov al,[bx]

     

    loop指令

    英文单词“loop”有循环的含义,显然这个指令和循环有关。  

    描述性符号“()”

    为了描述上的简洁,在以后的课程中,我们将使用一个描述性的符号 “() ”来表示一个寄存器或一个内存单元中的内容。 我们看一下(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

    ((ss)*16+(sp))=(ax)

    (8)对于pop ax 的功能,我们可以这样来描述:

    (ax)=((ss)*16+(sp))

    (sp)=(sp)+2

     

    约定符号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,l、mov bx,2、mov bx,3 等。

    mov ds,idata 就代表 mov ds,1、mov ds,2 等,它们都是非法指令。

     

    [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

    程序和内存中的情况如下图所示,写出程序执行后,21000H~21007H 单元中的内容。 [caption id="attachment_316" align="aligncenter" width="131"] 程序和内存中的情况[/caption] 思考后看分析。

    问题5.1分析

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

    mov ax,2000H

    mov ds,ax

    mov bx,1000H

    这三条指令执行后

    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=0002H。

      (4)再看第7条指令:

    mov [bx],ax

    指令执行前:

    ds=2000H,bx=1002H

    则 mov [bx],ax将把ax中的数据送入内存2000:1002处。 指令执行后:

    2000:1002单元的内容为BE,2000:1003单元的内容为00。

    [caption id="attachment_317" align="aligncenter" width="128"] 程序和内存中的情况[/caption] [buy] 获得所有教学视频、课件、源代码等资源打包 [/buy] [Downlink href='http://kuai.xunlei.com/d/LYMMNCQJNAFB']视频下载[/Downlink]
  • 相关阅读:
    appium-flutter-driver 测试flutter_boost项目_Java语言
    appium-flutter-driver 测试flutter项目
    Android Studio 制作出来的9图无法进行拖拉,导致无法制作出正确的9图
    Flutter 正确删除emoji表情/正确分割字符串
    如何清除git仓库的所有提交记录,成为一个新的干净仓库
    js中this的总结
    python判断时间是否在某个时间段里面的三种方式
    centos7使用rpm包安装mysql5.74
    django学习之 从服务端上传文档与下载文档接口
    python 之阿里云短信服务接入流程短信接口
  • 原文地址:https://www.cnblogs.com/LoveFishC/p/3846977.html
Copyright © 2011-2022 走看看