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

[BX]和loop指令

时间:2024-03-19 21:59:03浏览次数:25  
标签:abc BX mov 指令 ax bx loop

文章目录

[BX]和loop指令

1 [bx]

我们用[bx]表示一个内存单元,它的段地址默认在ds中,它的偏移地址在bx中,比如下面的指令:

mov ax,[bx]
mov al,[bx]

2 Loop指令

loop指令用于循环操作

指令的格式是:loop 标号

CPU 执行loop指令的时候,要进行两步操作:

① (cx)=(cx)-1;

② 判断cx中的值,不为零则转至标号处执行程序,如果为零则向下执行。

用loop指令计算212

assume cs:code

code segment
    mov ax,2
    mov cx,11
    
s:  add ax,ax
 	loop s

    mov ax,4c00h
    int 21h

code ends

end

3 在Debug中跟踪用loop指令实现的循环程序

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

代码如下:

assume cs:abc

abc segment

    mov ax,0ffffh
    mov ds,ax
    
    mov bx,6
    mov al,[bx]
    mov dx,0
    mov cx,3
    
s:	add dx,ax
    loop s
    
    mov ax,4c00h
    int 21h

abc ends

end

在汇编源程序中,数据不能以字母开头,所以要在第四行的ffff前面加0。

请添加图片描述

可以用p命令直接完成循环。

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

我们在Debug中写过类似的指令:

​ mov ax,[0]

表示将ds:0处的数据送入al中。

但是在汇编元程序中,指令“mov ax,[0]”被编译器当作指令“mov ax,0”处理,即编译器无法将[0]识别成一个内存地址,而是会将其当成数字。

这个问题有两种解决方案:

  • 通过BX来代替[0],我们先mov bx, 2 再通过mov ax, [bx]来完成。

  • 在偏移地址前加上段地址,即mov al, ds:[0]。

5 loop和[bx]的联合应用

计算ffff:0~ffff:b单元中的数据的和,结果存储在dx中。

代码如下:

assume cs:abc

abc segment

    mov ax,0ffffh
    mov ds,ax
    
    mov bx,0
    mov dx,0
    mov cx,12
    
s:	mov al,[bx]
    add dx,ax
    inc bx
    loop s
    
    mov a,4cooh
    int 21h

abc ends

end

这时我们就不用能常量给出内存单元的地址,而是用bx作为内存单元地址的变量。

6 段前缀

这些出现在访问内存单元的指令中,用于显式地指明内存单元的段地址的“ds:”、“cs:”、“ss:”或“es:”,在汇编语言中称为段前缀。

7 一段安全的空间

在8086模式中,随意向一段内存空间写入内容是很危险的 ,因为这段空间中可能存放着重要的系统数据或代码。

在一般的PC机中,DOS方式下,DOS和其他合法的程序一般都不会使用0:200~0:2FF( 0:200h~0:2FFh)的256 个字节的空间。所以,我们使用这段空间是安全的

以后,我们需要直接向一段内存中写入内容时,就使用0:200~0:2FF这段空间。

8 段前缀的使用

将内存ffff:0~ffff:b段元中的数据拷贝到 0:200~0:20b单元中。

代码一:

assume cs:abc

abc 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 a,4cooh
    int 21h

abc ends

end

因源单元ffff:X和目标单元0020:X 相距大于64KB,在不同的64KB段里,程序中,每次循环要设置两次ds。

这样做是正确的,但是效率不高。

我们可以使用两个段寄存器分别存放源单元ffff:X和目标单元0020:X的段地址,这样就可以省略循环中需要重复做12次的设置ds的程序段。

代码二:

assume cs:abc

abc segment
    mov ax,0ffffh
    mov ds,ax
    mov ax,0020h
    mov es,ax
    
    mov bx,0
    mov cx,12
    
s:  mov al,[bx]
    mov es:[bx],al
    inc bx
    loop s
    
    mov a,4cooh
    int 21h

abc ends

end

标签:abc,BX,mov,指令,ax,bx,loop
From: https://blog.csdn.net/weixin_74144099/article/details/136856662

相关文章

  • Vue2(五):收集表单数据、过滤器、自定义指令、Vue的生命周期
    一、收集表单数据爱好:学习<inputtype="checkbox"value="study"v-model="hobby">打游戏<inputtype="checkbox"value="games"v-model="hobby">吃饭<inputtype="checkbo......
  • 【工程应用九】再谈基于离散夹角余弦相似度指标的形状匹配优化(十六角度量化+指令集加
    继去年上半年一鼓作气研究了几种不同的模版匹配算法后,这个方面的工作基本停滞了有七八个月没有去碰了,因为感觉已经遇到了瓶颈,无论是速度还是效率方面,以当时的理解感觉都到了顶了。年初,公司业务惨淡,也无心向佛,总要找点事情做一做,充实下自己,这里选择了前期一直想继续研究的基于......
  • Redis第三弹,定时删除1.优先级队列(堆)2.基于时间轮实现的定时器​编辑Type指令(返回key对
    目录定时删除1.优先级队列(堆)2.基于时间轮实现的定时器​编辑Type指令(返回key对应的数据类型)redis的数据类型hsetkeyfieldvalue(这里是使用hash作为数据结构)小结定时删除redis并未实现定时器的方式,实现定时器的方式,实现过期key删除,若多个key过期,也可通过一个......
  • linux 系统指令
    linux系统指令常识~用户家路径/盘符路径查询指令pwd #当前工作目录ps #当前进程ls #显示当前目录下的文件列表ls-a #显示隐藏目录ls-R #递归显示目录中的内容ls-t #显示当前目录下的文件列表,按时间排序ls-l #显示详细信息ls-F #显示......
  • Linux基础指令学习(ubunt)
            现如今,Linux系统在服务器、嵌入式系统、移动设备等领域得到广泛应用,掌握Linux技能可以让你在各种领域都有发展机会。而且Linux系统是开源的,拥有庞大的开发者社区支持,学习Linux可以让你接触到开源文化,获取更多的资源和支持,在一套硬件上只能同时运行一个操作系......
  • 指令系统
    流水线时间计算流水线周期:指令分成不同执行段,用时最长的就是流水线周期流水线执行时间:1条指令执行总时间+(总指令条数-1)*流水线周期流水线吞吐率计算:指令条数/流水线时间流水线加速比计算:不使用流水线执行时间/使用流水线执行时间(肯定大于1)1s=10^3ms=1......
  • VUE项目忽略ResizeObserver loop completed with undelivered notifications错误
    忽略"ResizeObserverlooplimitexceeded"和"ResizeObserverloopcompletedwithundeliverednotifications."两种错误。向vue.config.js中添加以下代码:module.exports=defineConfig({...devServer:{client:{overlay:{warnings:fa......
  • Linux 解压指令
    zip/unzip常见格式-ddir:指定解压缩后的目标目录-l:列出zip文件中的内容,但不解压缩(List)-q:安静模式,不显示解压缩过程(Quiet)-o:覆盖已存在的文件而不询问(Overwrite)-n:不覆盖已存在的文件(Neveroverwrite)-x:排除某一文件(eXclude)查看内容unzip-lroot.zip #列出压缩包......
  • 发布 VectorTraits v2.0(支持 x86的Sse系列指令集等)
    目录支持x86的Sse系列指令集为Vector128/Vector256补充全部的向量方法提供CPU型号信息结果范例1:X86CPUonWindows结果范例2:ArmCPUonLinux结果范例3:ArmCPUonMacOS提供所支持的指令集信息结果范例1:X86CPUonWindows结果范例2:ArmCPUonLinux结果范例3:Arm......
  • perl 用 XML::LibXML DOM 解析 Freeplane.mm文件,生成测试用例.csv文件
    Freeplane是一款基于Java的开源软件,继承Freemind的思维导图工具软件,它扩展了知识管理功能,在Freemind上增加了一些额外的功能,比如数学公式、节点属性面板等。在云计算中,解析XML元素和属性是一种常见的操作,因为XML是一种常见的数据交换格式,可以用来表示各种不同的数据结......