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. ES简介及特点

    1.ES是什么? ES是一个高度可伸缩的开源的全文检索和分析引擎,它允许你以近实时的方式快速存储.搜索.分析大量数据,ES是基于Lucence开发,隐藏其复杂性,提供了简单易用的restful api ...

  2. GCD和LCM

    GCD _ LCM 是给你两个数A B 的最大公约数, 以及最小公倍数 the greatest common divisor and the least common multiply ! 最大公约 ...

  3. 怎样终止(杀掉) Linux 中的进程?

    使用 kill -9 进程号 命令, 可是强行终止该进程. 如果使用直接使用 kill 进程号 命令, 则会让进程 "自行了断" . 因此, 一般是 kill -9 进程号 用得较 ...

  4. 题解 CF670C 【Cinema】

    题目链接: https://www.luogu.org/problemnew/show/CF670C 思路: step-1: 语言的数据范围是10^9,所以我们采取用map离散化,这样就能方便且不ML ...

  5. Navicat for Mysql报错1251连接不成功Mysql

    第一步:打开Command Line Client   看清楚不是cmd,是在mysql的目录下,你会发现有2个一模一样其实哪个都行 第二步:输入mysql密码回车    就是安装mysql时设置的密 ...

  6. js之常用正则

    //用户名正则,4到16位(字母,数字,下划线,减号) let uPattern = /^[a-zA-Z0-9_-]{4,16}$/; //密码强度正则,最少6位,包括至少1个大写字母,1个小写字母, ...

  7. Lua入门记录

    学习资料 Lua入门和Lua高阶章节 Lua中文文档 阅读笔记,只是记录了知识点和一些注意点,详细的看上面提供的学习资料链接 Lua 基础数据类型 nil(空) boolean(布尔) Lua 中 n ...

  8. 【Java】 BIO与NIO以及AIO分析

    一.BIO与NIO以及AIO的概念 BIO是同步阻塞式的IO NIO是同步非阻塞的IO (NIO1.0,JDK1.4) AIO是非同步非阻塞的IO(NIO2.0,JDK1.7) 二.BIO简单分析 1 ...

  9. mysql 知识整理

    前言 安装 使用 关于mysql程式的linux命令 启动mysqld 检查端口是否运行 查看数据库程式相关信息 查看mysql版本 查看配置文件位置 登陆mysql 修改密码 SQL命令 查看数据库 ...

  10. SSH安装配置

    一.环境准备 二.SSH配置 1.root用户进入home目录,确实有无隐藏文件夹 .ssh cd ~ ls -lrta 2.有,则跳过本步骤:没有,执行如下命令 ##根据提示输入当前用户密码 ssh ...