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. COleVariant功能

    COLeVariant是数据库常用到的数据类型.它可以是字符串,整型值,日期等.知道怎样将它转换为CString. COLeVariant类是对VARIANT结构的封装.它的构造函数具有极为强大的功能 ...

  2. python-open函数

    open函数,该函数用于文件处理 操作文件时,一般需要经历如下步骤: 打开文件 操作文件 一.打开文件 1 文件句柄 = open('文件路径', '模式') 打开文件时,需要指定文件路径和以何等方式 ...

  3. 怎样理解 Vue 项目的目录结构?

      Vue 项目的目录结构如下, 我们将会在后面逐个去了解它们的作用: 01. build - 存储项目构建相关的代码, 比如 webpack. 02. config - Vue 的配置目录,包括端口 ...

  4. charles 抓包 (二)

    本文基于charles 抓包 https (1)中的配置完成. 1.移动设备上的网络请求 打开要调试的APP,请求就会先发送到Charles,然后验证是否允许访问. 当点击允许后,可以在Proxy - ...

  5. java lesson15Homework

    package lesson15; /** * 1. 使用ArrayList存储整型元素,并对元素进行升序输出 */ import java.util.ArrayList; import java.u ...

  6. ES6基础之——new Set

    Set 对象存储的值总是唯一的 Set 对象方法 方法 描述 add 添加某个值,返回Set对象本身. clear 删除所有的键/值对,没有返回值. delete 删除某个键,返回true.如果删除失 ...

  7. ubuntu python3.5升级3.6后打不开终端的解决办法

    ubuntu python3.5升级3.6后打不开终端了. 解决办法如下: 1.Ctrl+Alt+F1进入命令行终端,我的电脑按Ctrl+Alt+F1没反应,按住Ctrl+Alt然后从F1到F5一个个 ...

  8. HBuilderX 打包

    新建 - 云打包 (密钥 密码看不到 - 回车)    (  ) BlueStacks蓝叠 模拟器看效果

  9. Mysql(三)-3:完整性约束

    一 介绍 约束条件与数据类型的宽度一样,都是可选参数 作用:用于保证数据的完整性和一致性主要分为: PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录 FOREIGN KEY ...

  10. python函数:匿名函数、函数递归与二分法、面向过程编程

    今天主要讲三大部分内容: 一.匿名函数二.函数递归与二分法三.面向过程编程 一.匿名函数: """ 1. 什么时匿名函数 def定义的是有名函数:特点是可以通过名字重复调 ...