【汇编】Loop指令、段前缀

news2024/11/15 23:29:52

文章目录

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI技术:分享8个非常实用的AI绘画网站

目录 1、Midjourney 2、Stable Diffusion Omline 3、Microsoft Designer 4、Craiyon 5、NightCafe Studio 6、Wombo 7、Dalle-2 8、Avatar AI 1、Midjourney 特点:业内标杆,效果最强大 Midjourney是基于diffusion的AI图画艺术生成器。生成图片不…

PyTorch DataLoader整理函数详解【collate_fn】

DataLoader 是 PyTorch 中最常用的类之一。 而且,它是你首先学习的内容之一。 该类有很多参数,但最有可能的是,你将使用其中的大约三个参数(dataset、shuffle 和 batch_size)。 今天我想解释一下 collate_fn 的含义—根…

【开源】基于JAVA的快递管理系统

项目编号: S 007 ,文末获取源码。 \color{red}{项目编号:S007,文末获取源码。} 项目编号:S007,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 数据中心模块2.2 快递类型模块2.3 快…

windows 10 更新永久关闭

1 winR 输入:services.msc 编辑: 关闭:

【快速解决】实验三 简单注册的实现《Android程序设计》实验报告

目录 前言 实验要求 实验三 简单注册的实现 实验目的: 实验内容: 实验提示: 无 三、遇到的问题总结(如果有问题,请总结。如果没问题请写“无”) 正文开始 第一步建立项目 第二步选择empty views a…

Linux-top命令解释

Linux-top命令解释 常用参数查看所有逻辑核的运行情况:1查看指定进程的情况:-p pid显示进程的完整命令:-c 面板指标解释第一行top第二行tasks第三行%Cpu第四行Mem第五行Swap第六行各进程监控PID:进程IDUSER:进程所有者…

什么是BT种子!磁力链接又是如何工作的?

目录 一.什么是BT?1.BT简介:1.1.BT是目前最热门的下载方式之一1.2.BT服务器是通过一种传销的方式来实现文件共享的 2.小知识:2.1.你知道吗BT下载和常规下载到底有哪些不同2.2.BT下载的灵魂:种子2.3.当下载结束后,如果未…

Redis维护缓存的方案选择

Redis中间件常常被用作缓存,而当使用了缓存的时候,缓存中数据的维护,往往是需要重点关注的,尤其是重点考虑的是数据一致性问题。以下是维护数据库缓存的一些常用方案。 1、先删除缓存,再更新数据库 导致数据不一致的…

vulnhub靶机Momentum

下载地址:https://download.vulnhub.com/momentum/Momentum.ova 主机发现 目标192.168.21.129 端口扫描 端口版本扫描 漏洞扫描 扫出来点目录简单看看 发现js里面有一点东西 这里面告诉了我们了web文件有id传值,而且有aes加密还有密钥 跟二没有啥区别&…

ai的潜力和中短期的未来预测

内容来源:rickawsb ​对于描述ai的潜力和中短期的未来预测,我认为到目前为止可能没有比这篇推文总结得更好的了。 我读了三次。 文章起源于一个用户感叹openai升级chatgpt后,支持pdf上传功能,直接让不少的靠这个功能吃饭的创业公…

FISCOBCOS入门(十)Truffle测试helloworld智能合约

本文带你从零开始搭建truffle以及编写迁移脚本和测试文件,并对测试文件的代码进行解释,让你更深入的理解truffle测试智能合约的原理,制作不易,望一键三连 在windos终端内安装truffle npm install -g truffle 安装truffle时可能出现网络报错,多试几次即可 truffle --vers…

CTFhub-RCE-综合过滤练习

%0a、%0d、%0D%0A burp 抓包 修改请求为 POST /?127.0.0.1%0als 列出当前目录 返回包 http://challenge-135e46015a30567b.sandbox.ctfhub.com:10800/?ip127.0.0.1%0acd%09*here%0ac%27a%27t%09* _311632412323588.php

YOLOv8独家改进: Inner-IoU基于辅助边框的IoU损失,高效结合 GIoU, DIoU, CIoU,SIoU 等 | 2023.11

💡💡💡本文独家改进:Inner-IoU引入尺度因子 ratio 控制辅助边框的尺度大小用于计算损失,并与现有的基于 IoU ( GIoU, DIoU, CIoU,SIoU )损失进行有效结合 推荐指数:5颗星 新颖指数:5颗星 💡💡💡Yolov8魔术师,独家首发创新(原创),适用于Yolov5…

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

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

完整版解答!2023年数维杯国际大学生数学建模挑战赛B题

B题完整版全部5问,问题解答、代码,完整论文、模型的建立和求解、各种图表代码已更新! 大家好,目前已完成2023数维杯国际赛B题全部5问的代码和完整论文已更新,部分展示如下: 部分解答图表 问题分析 B题前三…

c++中的String

文章目录 String定义对象的方式成员函数operatorbegin/endsizecapacityreserversizeoperator/append/push_backoperator[]/at String String是一个类模版,可以定义一个字符/字符串对象。 字符顺序表 定义对象的方式 定义方式有很多重要的就这几种 string s1;stri…

屏蔽bing搜索框的今日热点

中国版的Bing简直比百度还恶心了,“今日热点”要是在搜索设置里关闭了就没法提供搜索建议了,不关吧看着又烦人,就像下图这样。另外还有右上角的下载bing app和Rewards图标也闲着没啥用,Rewards图标还老有小红点,真受不…

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

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

实验六:Android的网络编程基础

实验六:Android 的网络编程基础 6.1 实验目的 本次实验的目的是让大家熟悉 Android 开发中的如何获取天气预报,包括了 解和熟悉 WebView、WebService 使用、网络编程事件处理等内容。 6.2 实验要求 熟悉和掌握 WebView 使用 了解 Android 的网络编程…

cs与msf联动

实验环境 cs4.4(4.5版本不知道为啥实现不了) cs服务器与msf在同一台vps上 本地win7虚拟机 cs派生会话给msf 首先cs正常上线win7,这就不多说了,然后说如何将会话派生给msf cs准备 选择Foreign,这里可以选HTTP,也可以选HTTPS…