1.关于[bx]
1)[bx]用来表示取寄存器bx中的值作为偏移地址;
段地址保存在段寄存器ds中;
例如:将 2000:1000 处的数据保存到寄存器ax
mov ax,2000
mov ds,ax
mov bx,1000
mov ax,[bx]
 
2)指令inc
inc 为自增指令;
例如:将寄存器bx中的值自增1
inc bx
 
3)debug和masm对指令的不同处理
例如:想将1000:1处的值存入ax
在debug中代码如下:
mov ax,1000
mov ds,ax
mov ax,[1]
这里的 mov ax,[1]中的[1]表示偏移地址为1,段地址取段寄存器ds中的值;
而用masm编译时不会将[1]识别为偏移地址,而是当做常量1;
也就是说masm将mov ax,[1] 当作mov ax,1 ,作用是将ax中的值设为1;
为了达到原来的目的,可以用[bx];
代码:
mov ax,1000
mov ds,ax
mov bx,1
mov ax,[bx]
如果一定要用常量表示偏移地址,需要显式给出段寄存器
mov ax,1000
mov ds,ax
mov ax,ds:[1]
显式给出段寄存器时,该段寄存器称为段前缀;
段前缀默认是ds:
也可以用cs:、es、ss等代替;
 
4)段前缀的使用
例如:想要将 ffff:0~ffff:b中的数据复制到 20:0~20:b;
思路:
    将偏移地址放入bx;
    循环12次,每次bx中的值自增1,并且通过一个中转寄存器保存待复制数据;
    但这样涉及到一个问题:
        数据的段地址默认保存在段寄存器ds中;
        在每次复制中,需要设置两次ds的值:ffff和20;
    可以利用其它段寄存器分别存放两个段地址来解决这一问题,利用段前缀可指定段地址;
代码:
assume cs:code
code segment
 
    mov ax,ffff
    mov ds,ax
    mov ax,20
    mov es,ax
    mov bx,0
 
    mov cx,12
s:  mov dl,[bx]
    mov es:[bx],dl
    inc bx
    loop s
 
    mov ax,4c00h
    int 21h
code ends
end
 
2.loop指令
loop指令用来做循环操作;
loop的执行分为两步:
    1】寄存器cx中的值减1;
    2】判断cx中的值是否为0,不为0则跳转到标号处,为0则继续向下执行;
指令格式为:loop 标号;
标号是自定义的标记,用来标记特定指令的位置;
例如:计算2的3次方
assume cs:demo
demo segment
    mov ax,2
    mov cx,2
s:  add ax,ax
    loop s
    
    mov ax,4c00h
    int 21h
demo ends
end
 
3.loop和[bx]联合使用
例如:要实现 ffff:0-ffff:b中的数据累加,并将结果存入寄存器dx;
分析:
    1】每个内存单元数据为一个字节,而寄存器dx为一个字,无法直接计算;
    2】如果用dx的低位dl则可能超出dl的容量,累加后的结果可能超出8位;
    3】每一个字节的最大值为255,0-b有13个数,累加结果不会超过16位的25536,因此dx足够可以存放;
    4】可以用寄存器ax作为中介来实现字节和字之间的转换:将目标值存入al,ah设置为0,然后将ax的值累加到dx中;
代码:
assume cs:demo
code demo
    mov ax,ffff
    mov dx,ax
    mov bx,0
    mov dx,0
  
    mov cx,12
s:  mov ah,0
    mov al,[bx]
    add dx,ax
    inc bx
    loop s
 
    mov ax,4c00h
    int 21h
demo ends
end
 
4.安全空间
利用汇编指令直接向内存写入数据时,可能这段内存中保存有系统或其它程序的代码;
此时写入操作可能引发错误;
因为操作系统管理内存资源,如果需要向内存中写入数据时,要使用操作系统给我们分配的空间,而不应该随意指定内存地址;
在dos方式下,一般情况0:200~0:2ff空间不会有系统或其它程序的数据,通常可以直接使用该段空间;
为了谨慎起见,也可以用debug查询该段空间,如果单元内容都是0则表示该段内存单元没有被使用;
 
 
 

[bx]和loop的更多相关文章

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

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

  2. 汇编学习笔记(3)[bx]和loop

    本文是<汇编语言>一书的学习笔记,对应书中的4-6章. 汇编程序的执行 要想将源代码变为可执行的程序需经过编译.连接两个步骤,WIN7操作系统下需要MASM程序来进行编译连接工作.将MAS ...

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

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

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

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

  5. 【实验四】[bx]和loop的使用

    四.实验结论 任务一: (1) ①当我写 mov ax,b800h时,编译报错了. ②清屏后运行 (2)将源代码程序中字数据0403H→修改为0441H,再次运行,图案发生了变化. 任务二: (1) ...

  6. 汇编语言_实验四_[bx]和loop的使用

    四.实验结论 1.       实验内容1 (1)源代码: assume cs:code code segment mov ax,0b800h mov ds,ax mov bx,07b8h mov c ...

  7. 实验4 —— [bx]和loop的使用

    实验 综合使用 loop.[bx],编写完整汇编程序,实现向内存 b800:07b8 开始的连续 16 个字单元重复填充字数据 0403H. 以下为示例程序: assume cs:code # 1 c ...

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

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

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

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

  10. 汇编语言学习笔记(5)——[bx]和loop

    1.[bx]代表将bx寄存器中的值作为偏移地址. 2.loop与循环有关 3.inc bx的含义为bx中的内容+1 4.loop指令的格式为: loop 标号 CPU运行loop指令的时候.要进行两步 ...

随机推荐

  1. # codeblocks 使用技巧+伪单文件编译

    codeblocks 使用技巧+伪单文件编译 shift+F2打开和隐藏左侧工作空间 F2 打开和隐藏下面控制台 CTRL+Shift+c 注释,CTRL+Shift+x取消注释 view->p ...

  2. 六一广告页H5全屏滚动效果实现

    明天就六一儿童了(放假了),在这里提前祝大家周末快乐,每逢节假日公司必然会推出h5活动页的需求,这次六一儿童节也不例外,产品这次倒是没提什么互动效果需求,只不过根据UI妹子给的设计图,图片与图片中颜色 ...

  3. 解决MyEclipse发布按钮无效的办法

    删除Workspaces目录(存放您MyEclipse项目的地方)下的 “/.metadata/.plugins/org.eclipse.core.runtime/.settings/com.genu ...

  4. 对接外网post,get接口封装类库

    public class HttpHelper { public static string GetAsync(string url)  { HttpWebRequest request = WebR ...

  5. mark ubuntu 16.04 64bit + cpu only install mtcnn

    大神代码链接 称之为MTCNN人脸检测算法,同时有大神已经GitHub上开源了其基于caffe的C++ API 的源代码,https://github.com/DaFuCoding/MTCNN_Caf ...

  6. js中神奇的东西

    简单了解一些js的东西 window.history.go(-1);//历史记录-1,跳转到上一次操作的页面 Location 对象的 replace() 方法用于重新加载当前文档(页面) javas ...

  7. WebStorm 启动时提示Failed to load JVM DLL

    环境:win7 64位:时间:2019-11-18 问题描述 启动webstorm 时提示failed to load JVM DLL 解决方法 启动时快捷方式要选到64位的exe

  8. mac 下开发golang 配置

    1.安装golang 见附件 2.默认安装在  /usr/local/go 目录下 3.配置环境变量: 编辑文件:vim /etc/profile,有的MAC 下没有这个文件,可以新建. 加入环境变量 ...

  9. Java高并发程序设计学习笔记(三):Java内存模型和线程安全

    转自:https://blog.csdn.net/dataiyangu/article/details/86412704 原子性有序性可见性– 编译器优化– 硬件优化(如写吸收,批操作)Java虚拟机 ...

  10. Qt5配置winpCap

    在网上查了很多资料,搞了差不多一天总算解决Qt5使用winPcap配置的问题了!记录一下 以便后续忘记 1.下载winpcap4.1.3,百度即可搜索到 2.下载winpCap开发者工具包http:/ ...