英文原版地址:NASM Assembly Language Tutorials - asmtutor.com

背景知识

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

sys_write要求我们传递指向内存中我们想要输出的字符串的指针以及我们想打印的字节数长度。如果我们打算修改字符串,将不得不更新传给sys_write的字节数长度,否则将无法正确地打印。

你可以看到我打算用第二讲的程序,修改字符串为 'Hello, brave new world!',然后编译链接运行这个新程序,然后只输出 'Hello, brave '(前13个字符),因为我们仍旧传13个字节数给sys_write作为它的长度。当我们想打印用户输入时,这个长度时尤其重要的。当我们编译我们的程序时我们不知道数据的长度,我们需要一种在运行时计算程度的方法让字符串成功打印。

写代码

我们将使用一种叫做指针运算的技术来计算字符串的长度。两个寄存器被初始化执行内存中相同的地址。每有一个字符,寄存器(EAX)将向前递增1字节,直到我们到达字符串的末尾。然后从EAX减去初始指针。实际上像两个数组之间作差,结果得到两个地址之间元素的个数。然后将这个结果传到sys_write代替我们写死的数。

CMP指令比较左右两侧并设置用于程序流的若干标志。这个标志我们验证ZF或0标志。当EAX指向的字节等于0时,ZF标志被设置。我们使用JZ指令题跳转,如果ZF标志被设置,跳转到指向我们的程序标签 'finished'。这是用来结束 nextchar 循环并继续执行中止的程序。

使用下边的命令编译,链接然后执行这个程序 hello.asm

SECTION .data
msg     db      'Hello, brave new world!', 0Ah     ; 指定msg变量为你的消息字符串SECTION .text
global  _start_start:mov     ebx, msg        ; 将字符串的地址传给EBXmov     eax, ebx        ; 将传给EBX的地址也传给EAXnextchar:cmp     byte [eax], 0   ; 将EAX指向的字节与0做比较 (0是字符串结束的分隔符)jz      finished        ; 跳转 (如果ZF标记被设置) 跳转到标签'finished'指向的代码inc     eax             ; EAX中的地址增加1字节 (如果ZF标记没有被设置)jmp     nextchar        ; 跳转到标签'nextchar'指向的代码finished:sub     eax, ebx        ; 将EAX中的地址减去EBX中的地址; 两个寄存器开始指向相同的地址; 但是字符串每有一个字符EAX的地址就加一; 当你用一个地址减去另一个地址时; 这个结果就是它们之间的份数 - 在本例中就是字节数mov     edx, eax         ; 要写入的字节数,字符数加0ahmov     ecx, msg           ; 将消息的内存地址复制ECX寄存器mov     ebx, 1        ; 写到标准输出mov     eax, 4          ; 调用 SYS_WRITE (kernel opcode 4)int     80hmov     ebx, 0       ; 返回状态值0退出,无错误mov     eax, 1         ; 调用 SYS_EXIT (kernel opcode 1)int     80h

编译命令

nasm -f elf hello.asm

链接命令

ld -m elf_i386 hello.o -o hello

执行命令

./hello

NASM汇编教程翻译03 第三讲 计算字符串长度相关推荐

  1. NASM汇编教程翻译07 第七讲 换行符

    英文原版地址:NASM Assembly Language Tutorials - asmtutor.com 对于像"Hello world"这样的命令行程序,换行符时必不可少的. ...

  2. NASM汇编教程翻译09 第九讲 用户输入

    英文原版地址:NASM Assembly Language Tutorials - asmtutor.com 介绍BSS段 目前为止我们已经用了text段和data段,现在介绍下BSS段.BSS代表以 ...

  3. 【C 语言】字符串操作 ( strlen 与 sizeof 函数 | 计算 字符串长度 与 内存块大小 )

    文章目录 一.strlen 与 sizeof 函数 二.计算 字符串长度 与 内存块大小 一.strlen 与 sizeof 函数 strlen() 函数的作用是获取字符串大小 , 其原理是 从 内存 ...

  4. php 变量 长度,php 怎么计算字符串长度

    这篇文章主要介绍了利用PHP函数计算中英文字符串长度的方法,实例对比了PHP函数实现方法与正则表达式的实现方法,具有一定的参考借鉴价值,需要的朋友可以参考下 本文实例讲述了利用PHP函数计算中英文字符 ...

  5. Shell脚本中计算字符串长度的5种方法

    这篇文章主要介绍了Shell脚本中计算字符串长度的5种方法,来自于个人Shell脚本长期的开发经验,需要的朋友可以参考下 有时在Linux操作系统中需要计算某个字符串的长度,通过查询资料整理了下目前S ...

  6. 计算字符串长度.length()和数组长度.length的区别

    计算字符串长度.length()和数组长度.length的区别 写这篇文章主要是为了介绍在Java中如何获取字符串和数组的长度,文中会通过实例代码介绍计算字符串长度.length()和数组长度.len ...

  7. C语言计算字符串长度的方法

    C语言计算字符串长度的方法 思路分析 字符串的结束标志是'\0',因此计算字符串的长度的核心思想就是通过字符指针顺序检索每一个字符,直到检测到'\0'为止,以下是实现该算法的几种方式. 代码实现 1. ...

  8. C++_计算字符串长度

    LENGTH( len, str, p, n )        // 一个字符串的长度// input(str) len<-length(str) output(len) length(p)   ...

  9. php 字符串里面计算,php 计算字符串长度

    在项目的开发中,常常遇到要计算一个字符串的长度(中英文结合),由于产品要求不同,每个中文的长度要求也不一样. 解决utf-8编码下的字符串长度(可自定义每个中英文算几个字节) /** * 计算字符串长 ...

最新文章

  1. Office 365 系列之一:初识Office 365
  2. 五大常用算法之三:贪心算法
  3. leetcode 在排序数组中查找元素的第一个和最后一个位置
  4. django orm 常用查询筛选
  5. Android Asynchronous Http Client-Android异步网络请求客户端接口
  6. etcd和redis的比较和日常使用场景
  7. 最简单的目标跟踪(模版匹配)
  8. Spring Boot整合thymeleaf
  9. 区块链100讲:带你走进EOS的存储系统
  10. Python培训班怎么选?
  11. 分治法 —— 折半查找(递归与非递归)
  12. mysql 删除foreign key_MySQL-Foreign Key
  13. Fashion MNIST进行分类
  14. Deep Dream:理解深度神经网络结构及应用(实战篇)
  15. 红米笔记本linux系统版本,小米笔记本安装Win10+Ubuntu16.04 LTS 双系统
  16. 你需要知道的WAMP5
  17. win7网络不显示共享计算机,Win7电脑已开启共享却找不到设备 局域网显示空白该怎么解决...
  18. Windows 11操作系统 ndis.sys 驱动无限蓝屏问题修复
  19. 电脑微信聊天记录迁移——备份与恢复
  20. C语言itoa()函数

热门文章

  1. 电脑开机慢什么原因?如何管理禁止电脑开机自启动程序软件?
  2. 最新章节 第285节 计算机房的用户们,偷香最新章节:第285节 祈祷
  3. 老人玩的计算机游戏,适合老年人玩的7种游戏
  4. html中怎么制作花框,如何做立体花手工装饰相框
  5. QQ三国 秘制机簧去哪打?打的太慢?
  6. 雷鸟邮件--exchange server
  7. 用Python写一首中秋Rap
  8. I - 超凡大师 CSU - 2031: Barareh on Fire
  9. 文件权限修改方法(数字法)
  10. Android9.0访问不到服务器或者无法加载图片