【汇编】Loop指令、段前缀

文章目录

  • 前言
  • 一、Loop指令
    • 1.1 Loop指令是什么?
    • 1.2 他的条件是什么?
    • 1.3 例子
      • 示例1
      • 示例2
    • 1.4 要点总结
  • 二、段前缀
    • 2.1 为什么要引入他
    • 2.2 对策
  • 总结


前言

在计算机编程的世界里,了解底层的硬件操作是提升程序员能力的关键一步。汇编语言作为一种底层语言,直接操作计算机的硬件,其中的 LOOP 指令和段前缀是我们探讨的两个重要概念。LOOP 指令为我们提供了一种简洁的方式来实现循环,而段前缀则是用来指定数据存储位置的关键工具。在这篇文章中,我们将深入探讨这两个概念的作用和用法,以便读者更好地理解汇编语言的底层机制。


一、Loop指令

1.1 Loop指令是什么?

在汇编语言中,LOOP 指令是一个循环控制指令,用来简化循环结构的编写。这个指令的作用就像你在做同样的事情一遍又一遍,而不必重复写相同的代码。
通俗解释:
假设你在写程序,需要做一件事情多次,比如打印一系列数字。使用 LOOP 就像是告诉计算机:“嘿,这里有一段代码,我要重复执行它多次。” 计算机就会明白,不用你一遍遍写相同的指令。

1.2 他的条件是什么?

在高级语言中,我们知道,一个循环他肯定是需要一个条件的
那么我们的汇编语言也不例外,
他的条件如下:
CPU 执行loop指令时要进行的操作
①(cx)=(cx)-1;
②判断cx中的值
不为零则转至标号处执行程序
如果为零则向下执行。

要求
cx 中要提前存放循环次数,因为(cx)影响着
loop指令的执行结果
要定义一个标号

标号如下:

flag:
	;you want to do

other

其中flag就是标号,后面加冒号:

1.3 例子

示例1

想象你要打印数字1到10。使用 LOOP 你可以这样写:
MOV CX, 10 ; 将计数器CX设置为10

MY_LOOP:
    ; 这里放你要重复执行的代码,比如打印数字

    LOOP MY_LOOP ; CX减1,如果不为0,跳回MY_LOOP

在这个例子中,LOOP 指令会检查 CX 寄存器的值,如果不为零,就会跳回标记为 MY_LOOP 的地方,重复执行那段代码。这样你就不需要写十次相同的代码,只需要告诉计算机循环的次数,它会帮你搞定。

示例2

本示例为把2加11次,即2^11

assume cs:codesg
codesg segment

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

  mov ax,4c00h
  int 21h

codesg ends
end

在这里插入图片描述

我们通过在DOSBox中编译
在这里插入图片描述
在这里插入图片描述

然后使用debug进行追踪
在这里插入图片描述
使用r命令查看寄存器
在这里插入图片描述
使用t命令单步走
在这里插入图片描述
可以观察寄存器的值和后面要执行的命令可以发现,loop指令已经成功执行了。

1.4 要点总结

用cx和loop 指令相配合实现循环功能的三个要点:
(1)在cx中存放循环次数;
(2)用标号指定循环开始的位置;
(3)在标号和loop 指令的中间,写上要循环执行的程序段(循环体)。

二、段前缀

在汇编语言中,段前缀是一种用来指定数据存储位置的方式。在实模式下,x86 架构的计算机使用段寄存器来确定程序的数据在内存中的位置。通俗地说,段前缀就像是你告诉计算机:“我的数据在哪一块内存中”。
举例说明:
假设你有一块内存,存储了一串字符串。如果你想告诉计算机去读取这个字符串,你需要使用段前缀来指定这块内存的位置。
比如,DS(数据段寄存器)是一个常用的段寄存器。使用 DS 作为段前缀,你可以告诉计算机:“嘿,我的数据在 DS 寄存器指示的那一块内存里。”
MOV AX, DS ; 把数据段寄存器的值加载到通用寄存器AX中
MOV DS, AX ; 设置数据段寄存器为AX中的值,即指向你想访问的内存块

; 然后你可以使用寄存器BX来指定内存中的偏移量,访问具体的数据
MOV BX, 0 ; 从内存块的开始位置开始
MOV AL, [BX] ; 读取内存中BX指定位置的数据

这样,通过合理设置段前缀,你可以方便地在汇编语言中定位和访问存储在内存中的数据。

2.1 为什么要引入他

Debug中,mov al, [0]的功能是
——将DS:0存储单元的值传给AL

将下面这个代码编译,链接使用debug打开

assume cs:codesg
codesg segment

  mov ax,2000h
  mov ds,ax
  mov al,[0]
  mov bl,[1]
  mov cl,[2]

  mov ax,4c00h
  int 21h

codesg ends
end

在这里插入图片描述

使用u命令查看

在这里插入图片描述
他就变成

mov al,00
mov bl,01
mov cl,02

这属实让人大跌眼镜

2.2 对策

对策:在[idata]前显式地写上段寄存器

mov ax,2000h
mov ds,ax
mov bx,0
mov al,ds:[bx]
mov ax,2000h
mov ds,ax
mov al,ds:[0]

在这里插入图片描述

在这里插入图片描述
现在可以看到就是[0001]了

小结(在程序中):
mov al,[0]:(al)=0,同mov al,0
mov al,ds:[0]:(al)=((ds)*16+0)
mov al,[bx]:(al)=((ds)*16+(bx))
mov al,ds:[bx]:与mov al,[bx]相同

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


总结

汇编语言的学习不仅仅是为了理解代码的执行流程,更是为了掌握计算机底层的工作原理。本文中,我们深入研究了 LOOP 指令和段前缀的概念。LOOP 让我们能够更轻松地实现循环结构,提高代码的复用性和可读性;而段前缀则是在实模式下指定数据存储位置的关键,为程序员提供了对内存的更精准控制。通过理解和熟练运用这两个概念,我们可以更高效地编写汇编代码,更深入地理解计算机底层运作的原理。希望本文对读者在汇编语言的学习和应用中有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/160760.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【用unity实现100个游戏之15】开发一个类保卫萝卜的Unity2D塔防游戏5(附项目源码,完结)

文章目录 最终效果前言简单绘制一下环境显示当前波数生成不同的敌人控制游戏运行速度游戏结束最终效果扩展源码完结最终效果 前言 本期是本项目的最后一篇,主要内容是配置环境、生成不同敌人、结束重开。 简单绘制一下环境 环境可以按自己喜好,去找一些瓦片,想怎么配置怎…

基于热交换算法优化概率神经网络PNN的分类预测 - 附代码

基于热交换算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于热交换算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于热交换优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神经网络…

电脑技巧:低配置的旧电脑也可以使用Win11系统了

目录 一、优点和适用场景 二、下载以及版本说明 三、安装说明 四、Tiny11 设置安装简体中文语言方法 Windows 11,作为微软最新一代操作系统,固然有其强大的功能和卓越的性能,但有时,更轻、更小、更快速的需求也在用户的考虑范…

LLM大模型权重量化实战

大型语言模型 (LLM) 以其广泛的计算要求而闻名。 通常,模型的大小是通过将参数数量(大小)乘以这些值的精度(数据类型)来计算的。 然而,为了节省内存,可以通过称为量化的过程使用较低精度的数据类…

某app c++层3处魔改md5详解

hello everybody,本期是安卓逆向so层魔改md5教学,干货满满,可以细细品味,重点介绍的是so层魔改md5的处理. 常见的魔改md5有: 1:明文加密前处理 2:改初始化魔数 3:改k表中的值 4:改循环左移的次数 本期遇到的是124.且循环左移的次数是动态的,需要前面的加密结果处理生成 目录…

[C/C++]数据结构 链表(单向链表,双向链表)

前言: 上一文中我们介绍了顺序表的特点及实现,但是顺序表由于每次扩容都是呈二倍增长(扩容大小是自己定义的),可能会造成空间的大量浪费,但是链表却可以解决这个问题. 概念及结构: 链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接…

halcon识别验证码,先训练后识别

识别验证码图片,使用halcon 21.05 下面代码识别准确率100% 目录 训练,图片打标签使用代码创建分类器;识别验证码,检验识别效果使用“助手”加载训练文件,加载训练分类器,察看收集的字符,训练识别…

Theory behind GAN

假如要生成一些人脸图,实际上就是想要找到一个分布,从这个分布内sample出来的图片像是人脸,分布之外生成的就不像人脸。而GAN要做的就是找到这个distribution。 在GAN之前用的是Maximum Likelihood Estimation。 Maximum Likelihood Estimat…

【C++】类和对象(5)--运算符重载

目录 一 概念 二 运算符重载的实现 三 关于时间的所有运算符重载 四 默认赋值运算符 五 const取地址操作符重载 一 概念 C为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数…

Android 13.0 Launcher3仿ios长按app图标实现抖动动画开始拖拽停止动画

1.概述 在13.0的系统rom定制化开发中,在对系统原生Launcher3的定制需求中,也有好多功能定制的,在ios等电子产品中 的一些好用的功能,也是可以被拿来借用的,所以在最近的产品开发需求中,需求要求模仿ios的 功能实现长按app图标实现抖动动画,接下来看如何分析该功能的实现…

基于静电放电算法优化概率神经网络PNN的分类预测 - 附代码

基于静电放电算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于静电放电算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于静电放电优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神…

【数据结构与算法】JavaScript实现双向链表

文章目录 一、双向链表简介二、封装双向链表类2.0.创建双向链表类2.1.append(element)2.2.toString()汇总2.3.insert(position,element)2.4.get(position)2.5.indexOf(element)2.7.update(position,element)2.8.removeAt(position)2.9.其他方法2.10.完整实现 三、链表结构总结3…

苍穹外卖--员工分页查询

请求参数封装: Data public class EmployeePageQueryDTO implements Serializable {//员工姓名private String name;//页码private int page;//每页显示记录数private int pageSize;}请求结果封装: public class PageResult implements Serializable {…

青岛数字孪生赋能工业制造,加速推进制造业数字化转型

随着企业数字化进程的推进,数字孪生技术逐渐在汽车行业得到广泛应用。5G与数字孪生、工业互联网的融合将加速数字中国、智慧社会建设,加速中国新型工业化进程,为中国经济发展注入新动能。数字孪生、工业物联网、工业互联网等新一代信息通信技…

Pattern Recognition投稿经验

文章目录 ManuscriptTitle PageHighlightsAuthor BiographyDeclarationSubmit 合作推广,分享一个人工智能学习网站。计划系统性学习的同学可以了解下,点击助力博主脱贫( •̀ ω •́ )✧ 停更了大半年,近期终于完成了论文投稿,趁…

基于人工电场算法优化概率神经网络PNN的分类预测 - 附代码

基于人工电场算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于人工电场算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于人工电场优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神…

什么是PWA(Progressive Web App)?它有哪些特点和优势?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

【算法训练营】参数解析+跳石板

🌈欢迎来到Python专栏 🙋🏾‍♀️作者介绍:前PLA队员 目前是一名普通本科大三的软件工程专业学生 🌏IP坐标:湖北武汉 🍉 目前技术栈:C/C、Linux系统编程、计算机网络、数据结构、Mys…

跟我一起来做一个音视频产品功能!

前言: 大家好,上来和大家汇报一下h264翻译进度,目前翻译完了第六章,第七章快翻译完了,马上可以翻译第八章。 在第七章翻译完了之后,我会做一个知识点总结出来,一起学习,一起进步&…