Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Win32汇编:字符串操作指令

Win32汇编:字符串操作指令

作者头像
王 瑞
发布于 2022-12-28 06:53:14
发布于 2022-12-28 06:53:14
34900
代码可运行
举报
运行总次数:0
代码可运行

移动串指令: MOVSB、MOVSW、MOVSD ;从 ESI -> EDI; 执行后, ESI 与 EDI 的地址移动相应的单位 比较串指令: CMPSB、CMPSW、CMPSD ;比较 ESI、EDI; 执行后, ESI 与 EDI 的地址移动相应的单位 扫描串指令: SCASB、SCASW、SCASD ;依据 AL/AX/EAX 中的数据扫描 EDI 指向的数据, 执行后 EDI 自动变化 储存串指令: STOSB、STOSW、STOSD ;将 AL/AX/EAX 中的数据储存到 EDI 给出的地址, 执行后 EDI 自动变化 载入串指令: LODSB、LODSW、LODSD ;将 ESI 指向的数据载入到 AL/AX/EAX, 执行后 ESI 自动变化 其中的 B、W、D 分别指 Byte、Word、DWord, 表示每次操作的数据的大小单位.

上述指令可以有重复前缀: REP ECX > 0 时 REPE (或 REPZ) ECX > 0 且 ZF=1 时 REPNE(或 REPNZ) ECX > 0 且 ZF=0 时 ;重复前缀可以自动按单位(1、2、4)递减 ECX

字符串复制(movsb):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.data
	string1 db "hello lyshark",0      ; 原始字符串
	str_len equ $ - string1 -1        ; 计算出原始字符串长度
	string2 db str_len dup(?),0       ; 目标内存地址

.code
	main PROC
		cld                       ; 清除方向标志
		mov esi,offset string1    ; 取源字符串内存地址
		mov edi,offset string2    ; 取目标字符串内存地址
		mov ecx,str_len           ; 指定循环次数,为原字符串长度
		rep movsb                 ; 逐字节复制,直到ecx=0为止
		ret
	main ENDP
END main

另一种字串复制(movsb): 不使用rep重复前缀的方式完成字串复制.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.data
	string1 db "hello lyshark",0      ; 原始字符串
	str_len equ $ - string1 -1        ; 计算出原始字符串长度
	string2 db str_len dup(?),0       ; 目标内存地址

.code
	main PROC
		lea esi,string1               ; 取string1的地址
		lea edi,string2               ; 取string2的地址
		mov ecx,str_len               ; 取字符串长度,用于循环
		cld                       ; 方向->正向
	@@:	movsb                     ; 每次复制一个字节BYTE
		dec ecx                   ; 每次ecx减一
		jnz @B                    ; 如果ecx不为0则循环
		ret
	main ENDP
END main

(movsd)四字节复制字串:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.data
	ddSource DWORD 10h,20h,30h               ; 定义三个四字节数据
	ddDest   DWORD lengthof ddSource dup(?)  ; 得到目标地址

.code
	main PROC
		lea esi,ddSource
		lea edi,ddDest
		mov ecx,lengthof ddSource
		cld
		rep movsd
		ret
	main ENDP
END main

CMPSB:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.data
	Text1 db "hello lyshark",0
	Text2 db "hello lyshar1",0
.code
	main PROC
		lea esi,Text1
		lea edi,Text2
		mov ecx,lengthof Text1
		cld
		repe cmpsb
		je L1
		xor eax,eax            ; 字串不同则清空eax
		jmp L2
	L1:	xor ebx,ebx            ; 字串相同则清空ebx
	L2:	ret
	main ENDP
END main

CMPSD: 比对两个双字数据是否相等.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.data
	var1 DWORD 1234h
	var2 DWORD 5678h
.code
	main PROC
		lea esi,var1
		lea edi,var2
		cmpsd
		je L1
		xor eax,eax      ; 两数如果相等则清空eax
		jmp L2
	L1:	xor ebx,ebx      ; 两数不相等则清空ebx
	L2:	ret
	main ENDP
END main

CMPSW:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.data
	Array1 WORD 1,2,3,4,5      ; 必须全部相等才会清空ebx
	Array2 WORD 1,3,5,7,9
.code
	main PROC
		lea esi,Array1
		lea edi,Array2
		mov ecx,lengthof Array1
		
		cld
		repe cmpsw
		je L1
		xor eax,eax        ; 两数不相等则清空eax
		jmp L2
	L1:	xor ebx,ebx        ; 两数相等则清空ebx
	L2:	ret
	main ENDP
END main

SCASB 扫描字串: 依据 AL/AX/EAX 中的数据扫描 EDI 指向的数据, 执行后 EDI 自动变化

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.data
	szText BYTE "ABCDEFGHIJK",0
.code
	main PROC
	
		lea edi,szText
		mov al,"F"
		mov ecx,lengthof szText -1
		cld
		repne scasb                 ; 如果不相等则重复
		je L1
		xor eax,eax                 ; 如果没找到F则清空eax
		jmp L2
	L1:	sub ecx,lengthof szText -1
		neg ecx           ; 如果找得到, 这里显示是第几个字符; 本例结果是 6
	L2:	ret
	main ENDP
END main

STOSB 存储字串: 将 AL/AX/EAX 中的数据储存到 EDI 给出的地址, 执行后 EDI 自动变化

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.data
	len = 10
	szText db len dup(0),0
.code
	main PROC
		lea edi,szText                   ; EDI指向字符串
		mov al,"W"                       ; 定义查找字母为W
		mov ecx,len                      ; 设置查找计数器
		cld                              ; 方向=正向
		rep stosb                        ; ecx>0则执行
		ret
	main ENDP
END main

LODSW 载入指令: 将 ESI 指向的数据载入到 AL/AX/EAX, 执行后 ESI 自动变化,如下是累加求和

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.data
	Array WORD 1,2,3,4,5,6,7,8,9,10
.code
	main PROC
		lea esi,Array
		mov ecx,lengthof Array
		xor edx,edx
		xor eax,eax
	@@:	lodsw
		add edx,eax
		loop @B
		
		mov eax,edx           ; 最后将相加结果放入eax

	main ENDP
END main

初始化内存: 把String字符串中的,每一个字节均填充初始化为0FFh

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.data
	Count = 100                 ; 申请空间为100
	String BYTE Count DUP(?)    ; 初始化为BYTE
.code
	main PROC
		mov al,0FFh             ; 指定要填充的数据为0FFh
		mov edi,offset String   ; EDI寄存器指向目标内存
		mov ecx,Count           ; 循环计数
		cld                     ; 初始化:方向=前方
		rep stosb               ;AL中的值进行填充
		ret
	main ENDP
END main

数组的乘法: 把双字数组中的每一个元素分别乘以一个常量,程序中使用了(LODSD加载),(STOSD保存).

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.data
	Array DWORD 1,2,3,4,5
	Multi DWORD 10
.code
	main PROC
		mov esi,offset Array     ; 源指针
		mov edi,esi              ; 目的指针
		
		cld                      ; 方向=向前
		mov ecx,lengthof Array   ; 循环计数器
	L1:	lodsd                    ; 加载[esi]EAX
		mul Multi                ;EAX乘以10
		stosd                    ; 将结果从EAX存储至[EDI]
		loop L1
		ret
	main ENDP
END main

计算字符串长度: 以下代码用于计算字符串的长度,并将结果保存在EAX寄存器中.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.data
	String BYTE "hello world",0      ; 带计算字符串
.code
	main PROC
		mov edi,offset String    ; 取出字符串的基地址
		xor eax,eax              ; 清空eax用作计数器
		
	L1:	cmp byte ptr [edi],0     ; 分别那[edi]的值和0作比较
		je L2                    ; 上一步为零则跳转得到ret
		inc edi                  ; 否则继续执行
		inc eax
		jmp L1
	L2:	ret
	
	main ENDP
END main

小写字串转大写: 将MyString变量中的小写字符串,依次转换为大写字符串.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.data
	MyString db "hello lyshark",0      ; 定义MyString字符串

.code
	main PROC
		mov esi,offset MyString        ; 取出字符串的偏移地址
	L1:	cmp byte ptr [esi],0           ; 分别拿出每一个字节,0比较
		je L2                          ; 如果相等则跳转到L2
		and byte ptr [esi],11011111b   ; 执行按位与操作
		inc esi                        ; 每次esi指针递增1
		jmp L1                         ; 重复循环
	L2:	ret
	main ENDP
END main

定义二维数组: 定义一个二维数组Table,并取出第一行中的第2偏移地址的元素.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.data
	Table WORD 10h,20h,30h,40h,50h    ; 定义一个数组
	Row = ($ - Table)                 ; 取出数组每行的字节数
	      WORD 60h,70h,80h,90h,0Ah    ; 继续定义数组
.code
	main PROC
		row_index = 1                 ; 表的偏移地址
		column_index = 2              ; 行的偏移地址
		
		mov ebx,offset Table          ; 取偏移地址给ebx
		add ebx,Row*row_index         ; 每行元素*偏移
		
		mov esi,column_index          ; 将行偏移赋值给esi
		mov ax,[ebx+esi*TYPE Table]   ; Table比例因子只能是2,4,8
	main ENDP
END main
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-07-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Win32汇编:字符串操作指令
移动串指令: MOVSB、MOVSW、MOVSD ;从 ESI -> EDI; 执行后, ESI 与 EDI 的地址移动相应的单位
王 瑞
2022/12/22
5900
Win32汇编:汇编基本知识总结
汇编语言是所有程序设计语言中最古老的,它与计算机机器语言最为接近,通过汇编语言可以直接访问计算机的硬件,能够直接与CPU对话,可以说汇编语言是所有编程语言中语法格式最自由的,但自由的代价就是需要了解计算机体系结构和操作系统的大量细节,每编写一段程序都需要考虑各种硬件的状态,从而导致使用汇编写程序效率非常低.
王 瑞
2022/12/28
1.2K0
5.3 汇编语言:字符串操作指令
本章将深入研究字符串操作指令,这些指令在汇编语言中具有重要作用,用于处理字符串数据。我们将重点介绍几个关键的字符串操作指令,并详细解释它们的功能和用法。通过清晰的操作示例和代码解析,读者将了解如何使用这些指令进行字符串比较、复制、填充等常见操作。我们还将探讨不同指令之间的区别,并提供实际的示例程序,展示字符串操作指令在实际场景中的应用。通过学习本章,读者将能够拓展汇编技能,为处理字符串数据提供高效而精确的解决方案。
王 瑞
2023/10/11
5490
5.3 汇编语言:字符串操作指令
本章将深入研究字符串操作指令,这些指令在汇编语言中具有重要作用,用于处理字符串数据。我们将重点介绍几个关键的字符串操作指令,并详细解释它们的功能和用法。通过清晰的操作示例和代码解析,读者将了解如何使用这些指令进行字符串比较、复制、填充等常见操作。我们还将探讨不同指令之间的区别,并提供实际的示例程序,展示字符串操作指令在实际场景中的应用。通过学习本章,读者将能够拓展汇编技能,为处理字符串数据提供高效而精确的解决方案。
王 瑞
2023/08/22
6450
Win32汇编:字符串浮点数运算过程
整理复习汇编语言的知识点,以前在学习《Intel汇编语言程序设计 - 第五版》时没有很认真的整理笔记,主要因为当时是以学习理解为目的没有整理的很详细,这次是我第三次阅读此书,每一次阅读都会有新的收获,这次复习,我想把书中的重点,再一次做一个归纳与总结(注:16位汇编部分跳过),并且继续尝试写一些有趣的案例,这些案例中所涉及的指令都是逆向中的重点,一些不重要的我就直接省略了,一来提高自己,二来分享知识,转载请加出处,敲代码备注挺难受的。
王 瑞
2022/12/28
5350
Win32汇编:字符串浮点数运算过程
Win32汇编:汇编基本知识总结
汇编语言是所有程序设计语言中最古老的,它与计算机机器语言最为接近,通过汇编语言可以直接访问计算机的硬件,能够直接与CPU对话,可以说汇编语言是所有编程语言中语法格式最自由的,但自由的代价就是需要了解计算机体系结构和操作系统的大量细节,每编写一段程序都需要考虑各种硬件的状态,从而导致使用汇编写程序效率非常低.
王 瑞
2022/12/22
1.4K0
Win32汇编:字符串浮点数运算过程
整理复习汇编语言的知识点,以前在学习《Intel汇编语言程序设计 - 第五版》时没有很认真的整理笔记,主要因为当时是以学习理解为目的没有整理的很详细,这次是我第三次阅读此书,每一次阅读都会有新的收获,这次复习,我想把书中的重点,再一次做一个归纳与总结(注:16位汇编部分跳过),并且继续尝试写一些有趣的案例,这些案例中所涉及的指令都是逆向中的重点,一些不重要的我就直接省略了,一来提高自己,二来分享知识,转载请加出处,敲代码备注挺难受的。
王 瑞
2022/12/22
7010
Win32汇编:过程与宏调用
在计算机领域,堆栈是一个不容忽视的概念,堆栈是一种后进先出(LIFO,Last-In,First-Out)的数据结构,这是因为最后压入堆栈的值总是最先被取出,而新数值在执行PUSH压栈时总是被加到堆栈的最顶端,数据也总是从堆栈的最顶端被取出,堆栈是个特殊的存储区,主要功能是暂时存放数据和地址,通常用来保护断点和现场.
王 瑞
2022/12/28
7500
Win32汇编:各种语句的构造方式
整理复习汇编语言的知识点,以前在学习《Intel汇编语言程序设计 - 第五版》时没有很认真的整理笔记,主要因为当时是以学习理解为目的没有整理的很详细,这次是我第三次阅读此书,每一次阅读都会有新的收获,这次复习,我想把书中的重点,再一次做一个归纳与总结(注:16位汇编部分跳过),并且继续尝试写一些有趣的案例,这些案例中所涉及的指令都是逆向中的重点,一些不重要的我就直接省略了,一来提高自己,二来分享知识,转载请加出处,敲代码备注挺难受的。
王 瑞
2022/12/28
9670
Win32汇编:各种语句的构造方式
Win32汇编:过程与宏调用
在计算机领域,堆栈是一个不容忽视的概念,堆栈是一种后进先出(LIFO,Last-In,First-Out)的数据结构,这是因为最后压入堆栈的值总是最先被取出,而新数值在执行PUSH压栈时总是被加到堆栈的最顶端,数据也总是从堆栈的最顶端被取出,堆栈是个特殊的存储区,主要功能是暂时存放数据和地址,通常用来保护断点和现场.
王 瑞
2022/12/22
5420
Win32汇编:算数运算指令总结
整理复习汇编语言的知识点,以前在学习《Intel汇编语言程序设计 - 第五版》时没有很认真的整理笔记,主要因为当时是以学习理解为目的没有整理的很详细,这次是我第三次阅读此书,每一次阅读都会有新的收获,这次复习,我想把书中的重点,再一次做一个归纳与总结(注:16位汇编部分跳过),并且继续尝试写一些有趣的案例,这些案例中所涉及的指令都是逆向中的重点,一些不重要的我就直接省略了,一来提高自己,二来分享知识,转载请加出处,敲代码备注挺难受的。
王 瑞
2022/12/28
8460
Win32汇编:数组与标志位测试总结
整理复习汇编语言的知识点,以前在学习《Intel汇编语言程序设计 - 第五版》时没有很认真的整理笔记,主要因为当时是以学习理解为目的没有整理的很详细,这次是我第三次阅读此书,每一次阅读都会有新的收获,这次复习,我想把书中的重点,再一次做一个归纳与总结(注:16位汇编部分跳过),并且继续尝试写一些有趣的案例,这些案例中所涉及的指令都是逆向中的重点,一些不重要的我就直接省略了,一来提高自己,二来分享知识,转载请加出处,敲代码备注挺难受的。
王 瑞
2022/12/22
5040
Win32汇编:各种语句的构造方式
整理复习汇编语言的知识点,以前在学习《Intel汇编语言程序设计 - 第五版》时没有很认真的整理笔记,主要因为当时是以学习理解为目的没有整理的很详细,这次是我第三次阅读此书,每一次阅读都会有新的收获,这次复习,我想把书中的重点,再一次做一个归纳与总结(注:16位汇编部分跳过),并且继续尝试写一些有趣的案例,这些案例中所涉及的指令都是逆向中的重点,一些不重要的我就直接省略了,一来提高自己,二来分享知识,转载请加出处,敲代码备注挺难受的。
王 瑞
2022/12/22
6510
汇编实现: C库常见函数,串操作指令作用
movs指令的作用 主要使用了串操作指令movs指令 [esi] 拷贝->[edi] ecx计数 rep重复.
IBinary
2019/05/25
9460
5.12 汇编语言:仿写While循环语句
循环语句(While)一种基本控制结构,它允许程序在条件为真的情况下重复执行一段代码块,直到条件为假为止。循环语句在处理需要重复执行的任务时非常有用,它可以让程序更加高效地处理大量数据或者重复性操作。
王 瑞
2023/10/11
3670
Win32汇编:算术与伪指令
每种汇编语言都有进行操作数移位的指令,移位和循环移位指令在控制硬件设备,加密数据,以及实现高速图形运算时特别有用,移位指令也是汇编语言中最具特征的指令集,移位(Shifting)的含义是在操作数内向左或向右移动数据位,Intel处理器提供了多种移位指令,具体如下表所示:
王 瑞
2022/12/28
3750
5.11 汇编语言:仿写IF条件语句
条件语句,也称为IF-ELSE语句,是计算机编程中的一种基本控制结构。它允许程序根据条件的真假来执行不同的代码块。条件语句在处理决策和分支逻辑时非常有用。一般来说,条件语句由IF关键字、一个条件表达式、一个或多个代码块以及可选的ELSE关键字和对应的代码块组成。条件表达式的结果通常是布尔值(True或False),决定了程序将执行IF代码块还是ELSE代码块。
王 瑞
2023/10/11
7170
5.12 汇编语言:仿写While循环语句
循环语句(While)一种基本控制结构,它允许程序在条件为真的情况下重复执行一段代码块,直到条件为假为止。循环语句在处理需要重复执行的任务时非常有用,它可以让程序更加高效地处理大量数据或者重复性操作。
王 瑞
2023/08/24
4990
汇编知识扫盲之常见汇编指令
    MOV  传送字或字节.     MOVSX 先符号扩展,再传送.     MOVZX 先零扩展,再传送.     PUSH  把字压入堆栈.     POP  把字弹出堆栈.     PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.     POPA  把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.     PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.     POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.
IBinary
2019/05/25
1.8K0
汇编学习(10) 字符串
C语言中定义字符串是会以"\0"结束,汇编中不会这样,只要是一块连续的内存,都可以认为是字符串。 下面是一段操作字符串的代码:
一只小虾米
2022/12/19
4800
相关推荐
Win32汇编:字符串操作指令
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验