1- [bx]和内存单元的描述 [0]表示内存单元, 他的偏移地址为0

  mov ax,[0] 将一个内存单元的内容送入到ax.这个内存单元的长度为2字节(字单元),存放一个字,偏移地址为0,段地址在ds中.

  mov al,[0] 将一个内存单元的内容送入到al,这个内存单元的长度为1字节(字节单元),存放一个字节,偏移地址为0,段地址在ds中.

  完整的描述一个内存单元,需要两种信息:(1)内存单元地址(2)内存单元的长度(类型)

  mov ax,[bx] 将一个内存单元的内容送入到ax, 这个内存单元的长度为2字节(字单元),存放一个字,偏移地址在bx中,段地址在ds中.

  mov al,[bx] 将一个内存单元的内容送入到al, 这个内存单元的长度为1字节(字节单元),存放一个字,偏移地址在bx中,段地址在ds中.

2- 我们定义得描述性符号"()" 表示一个寄存器或一个内存单元中得内容.

  (ax) 表示ax中得内容,(al)表示al中得内容

  (20000H)表示内存20000H单元的内容,()中的内存单元的地址为物理地址

  (ds)*16+(bx)

()中的元素可以有三种类型

    1>寄存器名 (ax)

    2>段寄存器名(ds)

    3>内存单元的物理地址(一个20位数据) (20000H) ,((ds)*16+(bx))

      不正确的表示(1000H), (2000:0),((ds):1000H)

3- 约定符号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等

4- loop

  实现2^12 (N * 2 可以用N + N实现)

 assume cs:code
code segment
mov ax,
mov cx,
s: add ax, ax
loop s    ;(1) (cx) = (cx) - 1; (2)判断(cx)不为零则转到s所标示的地址处执行.如为0则执行下一条指令 mov ax, 4c00H
int 21h
code ends
end

计算ffff:0006单元中的数乘以3,结果存储在dx中.

 assume cs:code
code segment
mov ax, 0ffffH ;大于9FFFH的十六进制数据,A000H,B000H,FFFEH,FFFFH在书写时是以字母开头的,而在汇编程序中, 数据不能以字母开头.所以要在前面加0,如0FFFE
mov ds, ax
mov bx, 6H mov al, [bx]
mov ah, mov dx, mov cx,
s:add dx, ax
loop sa mov ax, 4c00H
int 21H
code ends
end

分析

(1) 运算后的结果是否会超出dx所能存储的范围

  ffff:0006存储的是一个字节型的数据,范围0-255之间,则用它乘以3结果不会大于65535,可以在dx中放下

(2) 我们循环累加实现乘法, 用哪个寄存器进行累加

  我们将ffff:0006单元中的数据赋值给ax, 用dx进行累加.先设(dx) = 0 ,然后做3次 (dx) = (dx) + (ax).

(3) ffff:6是一个字节单元,ax是一个16位寄存器,数据长度不一样,如何赋值?

  赋值:是要求ffff:0006单元中得数据,与ax中得数据值相等. 如 8位数据 06H 和 16位的 0006H 的数据长度不一样,但是值是相等的.

  (al) = (ffff6H)

  (ah) = 0

5- Debug和汇编编译器Masm对指令的不同处理

  Debug指令:

  mov ax,[0] 将ds:0处的数据送入ax中

  

  汇编编译器指令:

  mov ax,[0] 被编译器当做指令 mov ax,0   

 assume cs:code
code segment
mov ax,
mov ds,ax
mov ax,[0] mov ax,4c00H
int 21h
code ends
end

  

那么如何实现内存2000:0, 2000:1, 2000:2, 2000:3单元中得数据,送入al, bl, cl, dl中?

(1) 目前的方法是将偏移地址送入bx寄存器中,用[bx]方式访问内存单元. 访问 2000:0内存单元

mov ax,2000H

mov ds,ax

mov bx,0

mov al,[bx]

(2) 这样做是可以,但是比较麻烦,希望像debug中[]访问内存.只需要在"[]"前面显示的给出段地址所在的寄存器.

mov ax,2000H

mov ds,ax,

mov al,ds:[0]

比较下汇编程序中以下指令的含义:

mov ax,[0]    (ax) = 0

mov al,ds:[0]    (al) = ( (ds) * 16 + 0 )

mov al,[bx]     (al) = ( (ds) * 16  + (bx) )

mov al,ds:[bx]      (al) = ( (ds) *16 + (bx) ) 与 mov al,[bx]相同

6- loop和[bx]的联合应用

计算ffff:0-ffff:b单元中的数据和,结果存储到dx中.

分析:

(1) 运算后的结果是否超出dx的范围

  ffff:0-ffff:b单元中得范围为0-255 12个这样的数相加不能超过65535,可以在dx中存放下

(2) 是否将ffff:0-ffff:b中得数据直接累加到dx中

  当然不行,因为ffff:0-ffff:b中得数据是8位的,不能直接加到16位的寄存器中

(3) 能否将ffff:0-ffff:b中得数据累加到dl中, 并设置(dl)=0, 从而实现累加到dx中.

  不行,因为dl是8位寄存器,能容纳的数据范围0-255,ffff:0-ffff:b中得数据也是8位,如果向dl中累加12个8位的数据,很可能造成进位丢失

(4)到底怎样才能将ffff:0-ffff:b中的8位数据,累加到16位寄存器dx中

  在做累加时有两种方法

  (dx) = (dx) + 内存中得8位数据  //运算对象的类型不匹配

  (dl) = (dl) + 内存中得8位数据    //结果有可能超界

  我们用16位的寄存器来做中介,将内存中8位数据,赋值到一个16位的寄存器ax中, 再将ax中得数据累加到dx中.从而使两运算对象的类型匹配并且结果不会超界

  

  

[汇编语言]-第五章[bx]和loop指令的更多相关文章

  1. [汇编学习笔记][第五章[BX]和loop指令]

    第五章[BX]和loop指令 前言 定义描述性符号“()”来表示一个寄存器或一个内存单元的内容,比如: (ax)表示ax中的内容,(al)表示al的内容. 约定符号ideta表示常量. 5.1 [BX ...

  2. 王爽汇编第五章,[bx]和loop指令

    目录 王爽汇编第五章,[bx]和loop指令 [bx]和loop指令 例子: 王爽汇编第五章,[bx]和loop指令 [bx]和loop指令 [bx]之前我们介绍寄存器的时候,已经很详细的说明过了,b ...

  3. 第五章 [BX]和loop指令

    5.1 [bx] [bx]是什么 和 [0] 有些类似,[0] 表示内存单元,它的偏移地址是 0. 例如: mov ax, [0] 内存以字节为单位:ax以字(16bit = 2Byte)为单位:al ...

  4. 汇编语言-[BX]和loop指令

    汇编语言-[BX]和loop指令 [BX]指令介绍 mov ax,[bx] 功能: bx为偏移地址,段地址默认为ds.因此,上面指令作用就是将ax中的数据送入内存ds:bx处,即:((ds)*16 + ...

  5. 80806汇编(5)——[BX]和Loop指令

    80806汇编(5)--[BX]和Loop指令 已经好久没写点东西了,国庆节就一直想弄个个人网站,这段时间一直在弄那个,虽然有现成的框架(Hexo),但是总想弄出自己的效果来,但是最后还是有些差强人意 ...

  6. 小甲鱼零基础汇编语言学习笔记第五章之[BX]和loop指令

         这一章主要介绍什么是[BX]以及loop(循环)指令怎么使用,loop和[BX]又怎么样相结合,段前缀又是什么鬼,以及如何使用段前缀.   1.[BX]的概念      [BX]和[0]类似 ...

  7. 汇编语言-[bx]和loop指令和多个段

    5.1 [BX]和内存单元的描述 要完成描述一个内存单元,需要两种信息: 内存单元的地址: 可以用 [0] 表示一个内存单元, 0 表示单元的偏移地址,段地址默认在 ds 中: 同样也可以用 [bx] ...

  8. 汇编语言(学习笔记-----[bx]和loop)

    1.[bx]是什么??     和[0]有些类似,[0]表示内存单元,它的偏移地址是0      [bx]同样也表示一个内存单元,它的偏移地址在bx中,mov ax,[bx]  (字)   mov  ...

  9. [bx]和loop指令

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

随机推荐

  1. mysql 5.7占用400M内存优化方案

    mysql出问题了,装了一下新版本,竟然占用400多M的内存,这对于不是服务器,占用是在太高了,再开打一个开发工具,那电脑很卡了,其实是可以优化一下的,在my.ini文件找到这几个参数更改一下,占用大 ...

  2. [转]mac下Python升级到指定的版本

    以2.7升级到3.3为例1.删除原版本a)删除系统库中的版本sudo rm -R /System/Library/Frameworks/Python.framework/Versions/2.7 b) ...

  3. Win7/Win8 系统下安装Oracle 10g 提示“程序异常终止,发生未知错误”的解决方法

    我的Oracle 10g版本是10.2.0.1.0,(10.1同理)选择高级安装,提示“程序异常终止,发生未知错误”. 1.修改Oracle 10G\database\stage\prereq\db\ ...

  4. [转] Lisp语言:Do循环的使用

    转自http://blog.csdn.net/keyboardota/article/details/8240250 有关Lisp语言中的Do循环,就像很多人说的一样,初看起来太奇怪了,不知道怎么理解 ...

  5. 序列化类型为“System.Reflection.Module”的对象时检测到循环引用

    在使用ajax调用web services时,正好返回的类型为datatable,想用通过json方式直接解析,但调用后,得到如下错误: 序列化类型为“System.Reflection.Module ...

  6. order by 中 使用decode

    表内容如下: 实现以name字段中的ABCDE的顺序排序,以及按照money字段从小到大排序. select name,money from t2 ,,,,) , money

  7. 关于文字颜色/图片背景---selector状态列表

    文字颜色 android:textColor="@style/style_name" ----------------------------------widget 图片背景 a ...

  8. Bulk-Only传输协议 UFI命令块规范

    USB设备分为5大类,即显示器.通信设备.音频设备.人机输入和海量存储.通常所用的U盘.移动硬盘均属于海量存储类.海量存储类的规范中包括4个独立的子规范,即CBI传输.Bulk-Only传输.ATA命 ...

  9. Qt中事件处理的方法(三种处理方法,四种覆盖event函数,notify函数,event过滤,事件处理器。然后继续传递给父窗口。可观察QWidget::event的源码,它是虚拟保护函数,可改写)

    一.Qt中事件处理的方式   1.事件处理模式一 首先是事件源产生事件,最后是事件处理器对这些事件进行处理.然而也许大家会问, Qt中有这么多类的事件,我们怎么样比较简便的处理每个事件呢?设想,如果是 ...

  10. arcgis api for silverlight

    原文 http://blog.sina.com.cn/s/blog_4638cf7b0100wntt.html arcgis api for silverlight(1) (2011-09-21 09 ...