当前位置: 首页 > news >正文

简单汇编教程9 字符串与字符串指令

目录

字符串的指令

movs 字符串传送

lods, stos使用

cmpsb的使用

SCASB的使用


字符串你很熟悉了,我们定义了无数次了!

%macro ANNOUNCE_STRING 2%1 db %2%1_LEN equ $ - %1
%endmacro

当然,我们现在来学习一个比较新的定义方式,那就是跟C语言一样安插一个哨兵字符\0,它的ASCII值就是0

message DB 'I am loving it!', 0

后面我们会写一个函数叫做strlen函数!这里需要提示的就是我们的哨兵字符0会发挥最用!

字符串的指令

每个字符串指令可能需要一个源操作数,一个目标操作数或两者。对于32位段,字符串指令使用ESI和EDI寄存器分别指向源和目标操作数。但是,对于16位段,SI和DI寄存器分别用于指向源和目标。

有五个用于处理字符串的基本说明。他们是-

  • MOVS-该指令将1字节,字或双字数据从存储位置移到另一个位置。

  • LODS-该指令从存储器加载。如果操作数是一个字节,则将其加载到AL寄存器中;如果操作数是一个字,则将其加载到AX寄存器中,并将双字加载到EAX寄存器中。

  • STOS-该指令将数据从寄存器(AL,AX或EAX)存储到存储器。

  • CMPS-该指令比较内存中的两个数据项。数据可以是字节大小,字或双字。

  • SCAS-该指令将寄存器(AL,AX或EAX)的内容与内存中项目的内容进行比较。

上面的每个指令都有字节,字和双字版本,并且可以通过使用重复前缀来重复字符串指令。这些指令使用ES:DI和DS:SI对寄存器,其中DI和SI寄存器包含有效的偏移地址,这些地址指向存储在存储器中的字节。SI通常与DS(数据段)相关联,DI通常与ES(额外段)相关联。DS:SI(或ESI)和ES:DI(或EDI)寄存器分别指向源和目标操作数。假定源操作数位于内存中的DS:SI(或ESI),目标操作数位于ES:DI(或EDI)。

对于16位地址,使用SI和DI寄存器,对于32位地址,使用ESI和EDI寄存器。

基本指令操作的寄存器字节运算字运算双字运算
MOVSES:DI,DS:SIMOVSBMOVSWMOVSD
LODSDS:SILODSBLODSWLODSD
STOSES:DI,AXSTOSBSTOSSTOSD
CMPSDS:SI,ES:DICMPSBCMPSWCMPSD
SCASES:DI,AXSCASBSCASWSCASD

movs 字符串传送

这是字符串的传送指令,我的意思是:想要知道字符串如何传送,实际上需要ees, eds, edi, esi,ecx这几个寄存器。字符串的传送比较麻烦,因为你需要提供字符串的源地址(如果很长那还需要es, ds),以及传送的长度如何。

当然,传送长度就需要请出我们的ECX作为我们的Indexer了。下面我来露一手:

; --------------------------------------------------
;   Program written in 10.21 2024
;   Author:             Charlie chen
;   Functionality:      usage of movsb
; --------------------------------------------------
​
%macro ANNOUNCE_STRING 2%1 db %2%1_LEN equ $ - %1
%endmacro
​
; fast use of common value
%define MY_STDOUT       1
%define MY_SYS_WRITE    4
​
; print string in a simple way
%macro PRINT_STRING 2mov edx, %2mov ecx, %1mov ebx, MY_STDOUTmov eax, MY_SYS_WRITEint 0x80
%endmacro
​
%macro EASY_PRINT_STRING 1PRINT_STRING %1, %1_LEN 
%endmacro
​
section .dataANNOUNCE_STRING SOURCE, {"Charliechen is handsome", 0xA}BUFFER resb SOURCE_LEN
​
section .textglobal _start
​
_start:mov ecx, SOURCE_LENmov edi, BUFFERmov esi, SOURCEcld     ; 设置我们的拷贝顺序是从左到右rep movsb
​PRINT_STRING BUFFER, SOURCE_LEN
​mov ebx, 0mov eax, 1int 0x80

lods, stos使用

我们的这个指令是用来存储和加载字符串的,操作方式是对之做每一个定长大小做操作。举个例子,我们想要对每一个字符加上一个2,变成一个面目全非的字符串,我们可以这样做:

; --------------------------------------------------
;   Program written in 10.21 2024
;   Author:             Charlie chen
;   Functionality:      usage of stosb, lodsb
; --------------------------------------------------
​
%macro ANNOUNCE_STRING 2%1 db %2%1_LEN equ $ - %1
%endmacro
​
; fast use of common value
%define MY_STDOUT       1
%define MY_SYS_WRITE    4
%define MY_STDIN        0
%define MY_SYS_READ     3
​
; print string in a simple way
%macro PRINT_STRING 2mov edx, %2mov ecx, %1mov ebx, MY_STDOUTmov eax, MY_SYS_WRITEint 0x80
%endmacro
​
%macro EASY_PRINT_STRING 1PRINT_STRING %1, %1_LEN 
%endmacro
​
section .dataANNOUNCE_STRING SOURCE, {"Charliechen is handsome", 0xA}
section .bssBUFFER resb SOURCE_LEN
​
section .textglobal _start
​
_start:mov ecx, SOURCE_LENmov edi, BUFFERmov esi, SOURCE
do_add:lodsbadd al, 0x2stosbloop do_addcldrep movsb
​PRINT_STRING BUFFER, SOURCE_LEN
​mov ebx, 0mov eax, 1int 0x80

cmpsb的使用

cmpsb是一个一个比特的比较,自动看ecx作为比较的次数。你看,这里是一个简单的比较键盘输入的两个字符串的程序

; --------------------------------------------------
;   Program written in 10.21 2024
;   Author:             Charlie chen
;   Functionality:      usage of cmpsb
; --------------------------------------------------
​
%macro ANNOUNCE_STRING 2%1 db %2%1_LEN equ $ - %1
%endmacro
​
; fast use of common value
%define MY_STDOUT       1
%define MY_SYS_WRITE    4
%define MY_STDIN        0
%define MY_SYS_READ     3
​
; print string in a simple way
%macro PRINT_STRING 2mov edx, %2mov ecx, %1mov ebx, MY_STDOUTmov eax, MY_SYS_WRITEint 0x80
%endmacro
​
%macro EASY_PRINT_STRING 1PRINT_STRING %1, %1_LEN 
%endmacro
​
%macro READ_FROM_CONSOLE 2mov edx, %2mov ecx, %1mov ebx, MY_STDINmov eax, MY_SYS_READint 0x80
%endmacro
​
section .dataANNOUNCE_STRING INPUT_SRC1, "Tell me your first input:> "ANNOUNCE_STRING INPUT_SRC2, "Tell me your second input:> "ANNOUNCE_STRING IS_EQUAL, {"The String is equal!",0xA}ANNOUNCE_STRING IS_NOT_EQUAL, {"The String is not equal!",0xA}
​
section .bssSOURCE1 resb 20SOURCE2 resb 20
​
​
section .textglobal _start
​
_start:EASY_PRINT_STRING INPUT_SRC1READ_FROM_CONSOLE SOURCE1, 20EASY_PRINT_STRING INPUT_SRC2READ_FROM_CONSOLE SOURCE2, 20
​mov esi, SOURCE1mov edi, SOURCE2mov ecx, 20
​cldrepe cmpsbjecxz EQUALjmp NOT_EQUAL
​
EQUAL:EASY_PRINT_STRING IS_EQUALjmp EXIT
​
NOT_EQUAL:EASY_PRINT_STRING IS_NOT_EQUALjmp EXIT
​
EXIT:mov ebx, 0mov eax, 1int 0x80

SCASB的使用

SCAS指令用于搜索字符串中的特定字符或一组字符。要搜索的数据项应该在AL(对于SCASB),AX(对于SCASW)或EAX(对于SCASD)寄存器中。要搜索的字符串应在内存中,并由ES:DI(或EDI)寄存器指向。

section .textglobal _start        ;must be declared for using gcc_start:                 ;tell linker entry point
​mov ecx,lenmov edi,my_stringmov al , 'e'cldrepne scasbje found ; when found; If not not then the following codemov eax,4mov ebx,1mov ecx,msg_notfoundmov edx,len_notfoundint 80hjmp exitfound:mov eax,4mov ebx,1mov ecx,msg_foundmov edx,len_foundint 80hexit:mov eax,1mov ebx,0int 80hsection .data
my_string db 'hello world', 0
len equ $-my_string  
​
msg_found db 'found!', 0xa
len_found equ $-msg_found
​
msg_notfound db 'not found!'
len_notfound equ $-msg_notfound   

相关文章:

简单汇编教程9 字符串与字符串指令

目录 字符串的指令 movs 字符串传送 lods, stos使用 cmpsb的使用 SCASB的使用 字符串你很熟悉了,我们定义了无数次了! %macro ANNOUNCE_STRING 2%1 db %2%1_LEN equ $ - %1 %endmacro 当然,我们现在来学习一个比较新的定义方式&#xf…...

Taro构建的H5页面路由切换返回上一页存在白屏页面过渡

目录 项目背景:Taro与Hybrid开发问题描述:白屏现象可能的原因包括: 解决方案解决后的效果图 其他优化方案可参考: 项目背景:Taro与Hybrid开发 项目使用Taro框架同时开发微信小程序和H5页面,其中H5页面被嵌…...

【学习笔记】网络设备(华为交换机)基础知识 9 —— 堆叠配置

提示:学习华为交换机堆叠配置,含堆叠的概念、功能、角色、ID和优先级;堆叠的建立过程以及注意事项;包含堆叠的配置命令,以及堆叠的配置案例 一、前期准备 1.已经可以正常访问交换机的命令行接口 Console口本地访问教…...

jeston编译配置cuda加速版opencv

1.源码下载连接 opencv:Releases - OpenCV opencv-contrib: https://github.com/opencv/opencv_contrib 建议不要下最新版本 一般我会下4.5.4 // 4.5.6 // 4.6.0 opencv和opencv-contrib版本要对齐 将下好的opencv和opencv-contrib解压 将opencv-c…...

ApacheShiro反序列化 550 721漏洞

Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理个漏洞被称为 Shiro550 是因为在Apache Shiro的GitHub问题跟踪器中,该漏洞最初被标记为第550个问题,721漏洞名称也是由此而来 Shiro-550 CVE-2016-4437 Shiro反序列化Docker复现 …...

Github + 自定义域名搭建个人静态站点

Github 自定义域名搭建个人静态站点 使用 Github 部署一个自己的免费站点给你的站点添加上自定义域名 本文基于腾讯云基于二级域名, 作用于 Github 实现自定义域名站点 使用 Github 部署一个自己的免费站点 首先你得有一个 Github 账号, 没有就去注册一个,网上有教程,本文跳…...

使用OpenCV进行视频边缘检测:案例Python版江南style

1. 引言 本文将演示如何使用OpenCV库对视频中的每一帧进行边缘检测,并将结果保存为新的视频文件。边缘检测是一种图像处理技术,它可以帮助我们识别出图像中不同区域之间的边界。在计算机视觉领域,这项技术有着广泛的应用,比如物体…...

DataWhale10月动手实践——Bot应用开发task04学习笔记

一、图像流 1. 什么是图像流? 图像流是一种直观的图像处理流程工具,用户可以灵活组合各类图像处理模块。该系统将不同的图像处理工具模块化,并通过可视化界面,将这些模块以拖拽方式组合,构建完整的处理流程。用户可以…...

关于 IntelliJ IDEA 2024 安装使用

补丁文件...

React是如何工作的?

从编写组件到最后屏幕生成界面,如上图所示,我们现在需要知道的就是后面几步是如何运行的。 概述 这张图解释了 React 渲染过程的几个阶段: 渲染触发:通过更新某处的状态来触发渲染。渲染阶段:React 调用组件函数&…...

llama.cpp 去掉打印,只显示推理结果

llama.cpp 去掉打印,只显示推理结果 1 llama.cpp/common/log.h #define LOG_INF(...) LOG_TMPL(GGML_LOG_LEVEL_INFO, 0, __VA_ARGS__) #define LOG_WRN(...) LOG_TMPL(GGML_LOG_LEVEL_WARN, 0, __VA_ARGS__) #define LOG_ERR(…...

Word、PDF转换为图片Java

Word、PDF转换为图片Java 需求要在小程序端展示文档内容,所以将文档每页转换为图片后显示 参考和其他等方案: https://blog.csdn.net/strggle_bin/article/details/140599514 https://www.modb.pro/db/566986 https://blog.csdn.net/spring_is_comin…...

iOS IPA上传到App Store Connect的三种方案详解

引言 在iOS应用开发中,完成开发后的重要一步就是将IPA文件上传到App Store Connect以便进行测试或发布到App Store。无论是使用Xcode进行原生开发,还是通过uni-app、Flutter等跨平台工具生成的IPA文件,上传到App Store的流程都是类似的。苹果…...

Java中的Arrays类

java.util.Arrays是一个非常实用的类,提供了许多静态方法来操作数组,如排序、查找、复制和填充等。 1. toString - 将数组转换为字符串 // 导入java.util.Arrays类 import java.util.Arrays;public class ArraysExample {public static void main(Stri…...

GUI编程

GUI编程 【Java从0到架构师课程】笔记 GUI简介 GUI:图形用户界面,在计算机中采用图形的方式显示用户界面 java的GUI开发 AWT:java最早推出的GUI编程开发包,界面风格跟随操作系统SWT:eclipse就是java使用SWT开发的Sw…...

(multi)map和set--C++

文章目录 一、序列式容器和关联式容器二、set系列的使用1、set和multiset参考文档2、set类的介绍3、set的构造和迭代器4、set的增删查5、insert和迭代器遍历使用样例:6、find和erase使用样例:7、multiset和set的差异 三、map系列的使用1、map和multimap参…...

jmeter响应断言放进csv文件遇到的问题

用Jmeter的json 断言去测试http请求响应结果,发现遇到中文时出现乱码,导致无法正常进行响应断言,很影响工作。于是,察看了其他测试人员的解决方案,发现是jmeter本身对编码格式的设置导致了这一问题。解决方案是在jmete…...

复旦大学全球供应链研究中心揭牌,合合信息共话大数据赋能

10月13日,复旦大学全球供应链研究中心(以下简称“中心”)揭牌仪式在复旦大学管理学院政立院区隆重举行。我国的供应链体系庞大复杂,在百年未有之大变局下,保障产业链供应链安全已成为我国的重要战略目标。中心的设立旨…...

达那福发布新品音致系列:以顶尖降噪技术,开启清晰聆听新篇章

近日,国际知名助听器品牌达那福推出其最新研发的音致系列助听器。该系列产品旨在通过顶尖的声音处理技术,直面助听器市场中普遍存在的挑战——如何在噪声环境中提供清晰的语音辨识。 根据助听器行业协会2022年的调查数据,高达86%的佩戴者认为…...

当物理学奖遇上机器学习:创新融合的里程碑

作为一名程序员,看到 2024 年诺贝尔物理学奖颁发给机器学习与神经网络领域研究者,心中满是感慨与思考。 从编程技术角度出发,这意味着传统编程理念与物理思维有了更紧密的结合。在以往的编程中,算法优化多侧重于数据结构和计算效率…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...

dify打造数据可视化图表

一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...