首页 > 编程语言 >汇编语言学习_3_计算字符串长度

汇编语言学习_3_计算字符串长度

时间:2023-02-28 16:34:29浏览次数:54  
标签:eax 汇编语言 mov helloworld EAX len 字符串 长度

第三节

计算字符串长度

翻译自:https://asmtutor.com/

背景知识

为什么我们需要计算字符串的长度?

好吧,sys_write 要求我们向它传递一个指向我们要在内存中输出的字符串的指针,以及我们要打印出的字节长度。如果我们要修改我们的消息字符串,我们也必须更新我们传递给 sys_write 的字节长度,否则它不会正确打印。

您可以使用第二节中的程序了解我的意思。将消息字符串修改为“Hello, brave new world!”然后编译、链接并运行新程序。输出将是“Hello, brave”(前 13 个字符),因为我们仍然只将 13 个字节作为其长度传递给 sys_write。当我们想要打印出用户输入时,这将是特别必要的。由于我们在编译程序时不知道数据的长度,因此我们需要一种在运行时计算长度的方法,以便成功打印出来。

写程序

为了计算字符串的长度,我们将使用一种称为指针算法的技术。两个寄存器被初始化指向内存中的相同地址。对于输出字符串中的每个字符,一个寄存器(在本例中为 EAX)将向前递增一个字节,直到我们到达字符串的末尾。然后将从 EAX 中减去原始指针。这实际上类似于两个数组之间的减法,结果产生两个地址之间的元素数。然后将此结果传递给 sys_write 以替换我们的硬编码计数。

CMP 指令将左侧与右侧进行比较,并设置一些用于程序流的标志。我们正在检查的标志是 ZF (零标志)。当 EAX 指向的字节等于零时,设置 ZF 标志。然后,如果设置了 ZF 标志,我们将使用 JZ 指令跳转到程序中标记为“完成”的点。这是为了跳出 nextchar 循环并继续执行程序的其余部分。

; Hello World Program (Calculating string length)
; 编译: nasm -f elf helloworld-len.asm
; 链接 (64 bit 系统需要 elf_i386 选项): ld -m elf_i386 helloworld-len.o -o helloworld-len
; 运行: ./helloworld-len
 
SECTION .data
msg     db      'Hello, brave new world!', 0Ah ; 我们现在可以随意更改这个字符串了
 
SECTION .text
global  _start
 
_start:
 
    mov     ebx, msg        ; 将字符串地址移动到 EBX
    mov     eax, ebx        ; 将地址向 EAX 拷贝一份 (使得它们两个指向相同的地址)
 
nextchar:
    cmp     byte [eax], 0   ; 比较 EAX 指向的位置是否为0 (0代表着字符串的结束)
    jz      finished        ; 跳转到 finished (如果0标志被设置)
    inc     eax             ; EAX 自增1 (如果0标志没有被设置)
    jmp     nextchar        ; 跳转到 nextchar
 
finished:
    sub     eax, ebx        ; EBX - EAX,长度保存在EAX中
                            ; 两个寄存器开始时指向同一地址
                            ; 但EAX与msg中的字符对应地递增
                            ; 当同一类型的两个内存地址相减
                            ; 结果就是地址间的段数量,本例中就是字节数
 
    mov     edx, eax        ; EAX 现在的值就是字符串长度
    mov     ecx, msg       
    mov     ebx, 1
    mov     eax, 4
    int     80h
 
    mov     ebx, 0
    mov     eax, 1
    int     80h
~$ nasm -f elf helloworld-len.asm
~$ ld -m elf_i386 helloworld-len.o -o helloworld-len
~$ ./helloworld-len
Hello, brave new world!

标签:eax,汇编语言,mov,helloworld,EAX,len,字符串,长度
From: https://www.cnblogs.com/chai-yuan/p/17164792.html

相关文章

  • 汇编语言学习_4_函数
    第四节函数翻译自:https://asmtutor.com/介绍函数(子程序)函数/子程序(functions/subroutines)是可重用的代码片段,程序可以调用它们来执行各种可重复的任务。函数是使......
  • 【web开发基础】PHP快速入门(5)-PHP运算符之算术运算符和字符串运算符详解
    前言PHP开发基础开速入门系列《​【web开发基础】php开发基础快速入门(1)-PHP介绍及开发环境快速安装和基本使用介绍​》《​【web开发基础】php开发基础快速入门(2)......
  • 剑指Offer 58-||.左旋转字符串
    题目描述  解法一基本思路:直接移动classSolution{public:stringreverseLeftWords(strings,intn){for(inti=0;i<n;i++){......
  • shell中产生随机字符串的方法
    random变量echo$RANDOM8746生成0-32767之间的整数随机数,若超过5位可以加个固定10位整数,然后进行求余。再结合md5生成字符串echo$RANDOM|md5sum|head-c10e0......
  • c# 避免代码中直接暴露字符串
    ///<summary>///避免代码中直接暴露字符串///将字符串转字节///</summary>///<paramname="byteDatas"></param>......
  • [转]Redis干货 | 五种常用类型之String字符串详解
    一.背景说明小白:伟哥,java中String是最常用类型,Redis中也是吗?伟哥:差不多,我给你稍微讲一下。二.数据类型依据Redis官网,目前Redis数据类型共计九种。具体整理如下:......
  • hashc长度拓展攻击
    一、hash长度攻击的简要介绍1、首先什么是hash长度拓展攻击?简单来说,由于hash的生成机制原因,使得我们可以认为的在原先明文数据的基础上添加新的拓展字符,使得原本的加密链......
  • 代码随想录训练营day 2 |977有序数组的平方 209.长度最小的子数组 (C++)
    977、有序数组的平方题目链接:977、有序数组的平方题目描述:给你一个按非递减顺序排序的整数数组nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。例......
  • KMP算法(字符串匹配算法最优解)
    KMP算法重点在于求next数组,理解next数组的含义。next数组的作用是当某次子串和主串匹配失败时,迅速的判断出字串索引j应该等于多少,而不回退主串的索引i,从而减少时间复杂度,......
  • 汇编语言学习_2_正确的退出方式
    第二节正确的退出方式翻译自:https://asmtutor.com/背景知识在Lesson1中成功学习了如何执行系统调用之后,现在需要学习内核中最重要的系统调用之一sys_exit。请注......