首页 > 其他分享 >五--[BX]和loop指令

五--[BX]和loop指令

时间:2022-08-28 19:34:10浏览次数:81  
标签:-- BX mov 单元 ax bx ds loop 内存

用[0]表示一个内存单元时,0表示偏移地址,段地址默认在ds中,单元的长度(类型)由具体指令中的其他对象指出

我们定义的描述性符号:“()”,表示一个寄存器或内存单元中的内容,比如
  (ax)表示ax中的内容、(20000H)表示内存20000H单元的内容

  (2000:0)、((ds):1000H)是不正确用法。

约定idata表示常量

汇编源程序中,数据不能以字母开头,在前面加0,比如0A000h

g命令:g 0012:使Debug从当前CS:IP指向的指令执行,直到(IP)=0012h为止

p命令:遇到loop指令时,用p命令,debug会自动重复循环,直到(cx)=0

1.[BX]

2.loop指令

  格式:loop 标号

  (1)(cx) = (cx) - 1

  (2)判断cx中的值,不为零就转至标号处执行

  cx中存放循环次数

4.debug和汇编编译器masm对指令的不同处理

  debug将[idata]解释为一个内存单元,“idata”是内存单元的偏移地址,而编译器将“[idata]”解释为“idata”

  怎样在源程序实现将2000:0中的数据送入al呢

  (1)将偏移地址送入bx,用[bx]的方式访问内存单元

    mov ax,2000h

    mov ds,ax

    mov bx,0

    mov al,[bx]

    这样比较麻烦

  (2)在“[]”的前面显式地给出段地址所在的段寄存器

    mov ax,2000h

    mov ds,ax

    mov al,ds:[0]

5.loop和[bx]的联合应用

  要计算ffff:0~ffff:b单元中数据的和,结果存到dx:

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

      字节型数据,范围0~255,12个这样的数不会超过65535

    (2)能直接累加到dx吗?
      ffff:0~ffff:b中数据是8位的,不能直接累加到16位的dx

    (3)能否将数据累加到dl中,并设置(dh)=0,从而实现累积到dx中?

      向dl中累加12个8位数据,会进位丢失

    (4)到底怎样?

      用一个16位寄存器做中介,将内存单元中的8位数据赋值到一个16位寄存器ax,再将ax中的数据加到dx上,从而使运算对象类型匹配且结果不超界。

        mov al,ds:[0]

        mov ah,0

        add dx,ax

    如果表示内存单元偏移地址的X是个变量,就不能用常量表示偏移地址,将偏移地址放到bx中,每次循环bx+1

      s:  mov al,[bx]

          mov ah,0

          add dx,ax

          inc bx

          loop s

6.段前缀

  mov ax,ds:[bx]

  这些出现在访问内存单元的指令中,用于显示地指明内存单元的段地址的“ds:”,“cs:”,称为段前缀

7.一段安全的空间

  dos方式下,一般0:200~0:2ff空间中没有系统或其他程序的数据或代码

8.段前缀的使用

  要将内存ffff:0~ffff:b中的数据复制到0:200~0:20b单元中:

    0:200~0:20b即0020:0~0020:b

    assume cs:code

    code segment

      mov bx,0
      mov cx,12
    s:    mov ax,0ffffh
      mov ds,ax
      mov dl,[bx]
      
      mov ax,0020h
      mov ds,ax
      mov [bx],dl

      inc bx
      loop s
      mov ax,4c00h
      int 21h
    code ends
    end

    因为源始单元ffff:X和目标单元0020:X相距大于64KB,在不同的64KB段里,每次循环要设置两次ds,效率不高

    用两个段寄存器分别存放两单元的段地址,可省略循环中的设置程序段

      mov ax,0ffffh

      mov ds,ax

      mov ax,0020h

      mov es,ax

      mov bx,0

      mov cx,12

    s:     mov dl,[bx]

      mov es:[bx], dl

      inc bx

      loop s

     

标签:--,BX,mov,单元,ax,bx,ds,loop,内存
From: https://www.cnblogs.com/cangshiqian/p/16633443.html

相关文章

  • 2022-08-23 day33 第一小组 王鸣赫
    目录CSS三大特性1、层叠性2、继承性3、优先级常用单位字体背景列表属性盒子模型display的inline、block、inline-block的区别文档流定位定位的left和top、right和bottom和m......
  • gym-103708B Building 5G antennas
    Building5Gantennasdfs剪枝要字典序最小,显然第一个点就是\(1\),后面考虑走\(k\)步后能到达的点集中选一个字典序最小的,重复该过程考虑\(set[i][j]\)表示第\(i\)......
  • 哈夫曼树
    哈夫曼树一、定义:给定N个权值作为N个叶子结点,构建一颗二叉树,使该树的WPL(带权路径长度)最小,即为一颗哈夫曼树(又称最优二叉树)。二、相关知识:路径和路径长度(L):树中的每一......
  • 2022.8.28
    看了下斯特林数和多项式,在旁边听hyy和lzx讲课,顺便捉了几个Bug,算是复习了一下计数。写了些多项式。之后打洛谷上的比赛,第二题不会,感觉很神奇。Todo:讲dp。改洛谷比赛题......
  • serilog-asp.net
     这是 serilog-asp.net的demo:   https://github.com/serilog/serilog-aspnetcore/blob/dev/samples/Sample/Program.cs开始是这一句话//Theinitial"bootstrap......
  • python常用的进制、字符串、字节之间的转换
    整数之间的进制转换:10进制转16进制:hex(16) ==> 0x1016进制转10进制:int('0x10',16) ==> 16类似的还有oct(),bin()  字符串转整数:10进制字符串:int('10......
  • EvaluationSystem:后端业务接口(js同步操作数据库)
    1、用户业务接口(services/user.js)用户相关业务:注册账号登录账号查看用户信息修改个人资料2、数据业务接口(services/data.js)添加一条数据查询一条数据所有数据......
  • 百度之星的总结
    一个字,寄.从昨天岔路迷惑我很久,到今天按着那棵树调我的概率,,最后才看到是求的时间的期望,,,,把大量时间和精力浪费到了看错题目上.而且没有有效地转换题目,死磕带来......
  • ECCV2022_Slimmable:(ARM-Net)ARM Any-Time Super-Resolution Method
    Institute:MACLab,DepartmentofArtificialIntelligence,XiamenUniversityAuthor:BohongChen,MingbaoLin,KekaiSheng,MengdanZhang,PeixianChen,KeLi,L......
  • 9.设计模式-原型模式
    1.单例模式1.饿汉式packagecom.serlyf.singleton;/***单例模式-饿汉式*1.构造私有*2.本类创建静态示例*3.getInstance()方法公开*/publicclassSingl......