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

对于像”Hello world“这样的命令行程序,换行符时必不可少的。一旦我们开始构建要求用户输入的程序,它们变得更重要。但是换行符维护起来可能会变得麻烦。有时想在字符串包含它们,有时也想删去它们。如果你继续通过在声明消息文本后添加 0AH 的方式在你的变量中硬编码换行符,它将变成一个问题。如果这是代码中一处我们不想输出这个变量的换行符的地方,需要去写一些额外逻辑在运行时从字符串中删去。

如果我们写一个子程序输出我们的消息后打印一个换行符,对于程序的维护性是有好处的。这样,当我们需要换行符时调用这个子程序,不需要时就调用现在的sprint子程序。

调用 sys_write 需要我们传递指向想输出的字符串在内存中地址的指针,所以我们不能只传一个换行符给我们的打印函数。我们也不想仅为了保存换行符去创建另一个变量,所以用栈来代替。

这个方法是通过将换行符移到EAX寄存器中运作的。我们将EAX压到栈上然后通过扩展栈指针寄存器ESP获取地址。ESP是另一个寄存器。当ESP指向一个字符在内存中的地址,sys_write将被允许使用它去打印。

functions.asm文件

;------------------------------------------
; int slen(String message)
; 字符串长度计算函数
slen:push    ebxmov     ebx, eaxnextchar:cmp     byte [eax], 0jz      finishedinc     eaxjmp     nextcharfinished:sub     eax, ebxpop     ebxret;------------------------------------------
; void sprint(String message)
; 字符串打印函数
sprint:push    edxpush    ecxpush    ebxpush    eaxcall    slenmov     edx, eaxpop     eaxmov     ecx, eaxmov     ebx, 1mov     eax, 4int     80hpop     ebxpop     ecxpop     edxret;------------------------------------------
; void sprintLF(String message)
; 打印字符串和换行符函数
sprintLF:call    sprintpush    eax         ; 当我们在这个函数中使用EAX时通过将EAX压入栈来进行保护mov     eax, 0AH    ; 将0AH移到EAX中 - 0AH是换行符的ascii码push    eax         ; 将换行符放到栈上,以便我们获取地址mov     eax, esp    ; 将当前栈指针的地址放到EAX寄存器中给sprint函数call    sprint      ; 调用sprint函数pop     eax         ; 从栈上移除换行符pop     eax         ; 恢复调用函数前EAX原本的值ret                 ; 返回程序;------------------------------------------
; void exit()
; 退出程序并复原资源
quit:mov     ebx, 0mov     eax, 1int     80hret

hello.asm文件

%include        'functions.asm'                             ; 包含我们的外部文件SECTION .data
msg1    db      'Hello, brave new world!', 0h               ; 注:已经移除了换行符
msg2    db      'This is how we recycle in NASM.', 0h       ; 注:已经移除了换行符SECTION .text
global  _start_start:mov     eax, msg1       ; 将第一个字符串的地址给EAXcall    sprintLF        ; 注:调用带有换行符的字符串打印函数mov     eax, msg2       ; 将第二个字符串的地址给EAXcall    sprintLF        ; 注:调用带有换行符的字符串打印函数call    quit            ; 调用退出函数

编译命令

nasm -f elf hello.asm

链接命令

ld -m elf_i386 hello.o -o hello

执行命令

./hello

NASM汇编教程翻译07 第七讲 换行符相关推荐

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

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

  2. NASM汇编教程翻译03 第三讲 计算字符串长度

    英文原版地址:NASM Assembly Language Tutorials - asmtutor.com 背景知识 为什么我们需要计算字符串长度? sys_write要求我们传递指向内存中我们想要 ...

  3. Away3D 4.0官网教程(翻译)

    使用Away3D 4.Stage3D 创建3D游戏和应用程序 (此帖每天都会更新,一定让大家完全的搞明白) 补充区:        'vase.awd' 可以使用 Prefab3D打开(在帖子后面回复 ...

  4. linux 自启动服务 SYSV,技术|LFCS 系列第七讲:通过 SysVinit、Systemd 和 Upstart 管理系统自启动进程和服务...

    几个月前, Linux 基金会宣布 LFCS (Linux 基金会认证系统管理员) 认证诞生了,这个令人兴奋的新计划定位于让来自全球各地的初级到中级的 Linux 系统管理员得到认证.这其中包括维护已 ...

  5. NASM汇编初探(入门教程)

    Learn Assembly Language 文章目录 Learn Assembly Language 1. Lesson 1 Hello, world! 1.1 Background 1.2 Wr ...

  6. 32位汇编第七讲,混合编程,内联汇编

    32位汇编第七讲,混合编程 博客园IBinary原创 QQ:2510908331  博客连接:http://www.cnblogs.com/iBinary/ 转载请注明出处,谢谢 混合编程的概念,有时 ...

  7. 《ArcGIS Engine+C#实例开发教程》第七讲 图层符号选择器的实现2

    <ArcGIS Engine+C#实例开发教程>第七讲 图层符号选择器的实现2 原文:<ArcGIS Engine+C#实例开发教程>第七讲 图层符号选择器的实现2 摘要:在第 ...

  8. 计算机专业英语被动语态举例,第七讲被动语态的译法_计算机专业英语教程

    第七讲被动语态的译法_计算机专业英语教程 第七讲 被动语态的译法 (Translation of Passive Voice) 被动语态在英语中,特别是科技英语中运用得非常广泛,而汉语的被动句则用得较 ...

  9. Deep Learning 教程翻译

    Deep Learning 教程翻译 非常激动地宣告,Stanford 教授 Andrew Ng 的 Deep Learning 教程,于今日,2013年4月8日,全部翻译成中文.这是中国屌丝军团,从 ...

最新文章

  1. 【蓝桥java】进制与整除之尼姆堆
  2. 将一个PPT文档按页分割成多个PPT文档的代码
  3. Codeforces Round 263(Div. 2)
  4. wdcp mysql密码_wdcp默认的mysql密码是多少?
  5. java returnaddress,JVM之数据类型
  6. Java中带标签的break,continue
  7. java类型之间的转换_JAVA基本数据类型及之间的转换
  8. 解决phpcms模版设置中不能显示栏目首页模板,栏目列表页模板,内容页模板等下拉菜单选项的问题!...
  9. ajax中POST请求与参数(请求体)设置
  10. r k-means 分类结果_《机器学习》之 Kmeans聚类的原理及代码
  11. 怎样更改itunes备份位置_iphone备份太大,严重挤占C盘空间,怎么把备份放在其他的硬盘?...
  12. JSP学习 三大指令、九个内置对象、JavaBean、EL表达式
  13. 使用OpenResty搭建高性能服务端
  14. java 省市县数据_Jsoup获取全国地区数据(省市县镇村)
  15. 【六维空间】即将免费开放注册
  16. Vue中使用echarts,echarts 封装以及使用的事项
  17. dns被劫持怎么办?网页总是跳转到别的、你的DNS可能被劫持了!
  18. 相濡以沫,何能相忘于江湖
  19. cts测试如何跳过某个模块不测过
  20. 【观察】从社恐症到社牛症,有一台微软Surface就够了

热门文章

  1. springboot+layui样式加载不进来No mapping for GET /layui/css/layui.css
  2. 滨州学院CSDN高校俱乐部第二次公开课——微信公众平台开发SAE使用
  3. vscode怎么快速打不是html标签的双标签呢?比如vue里面的自定义双标签
  4. 关于TFT LCD屏ST7735S驱动移植STM32HAL库的部分问题总结
  5. python中yield语句的作用_Python中关键字yield有什么作用
  6. 当前网友眼中越老越吃香的行业到底是什么?
  7. 1018 锤子剪刀布 (20 分)(算法分析+代码实现)
  8. 突击蓝桥杯嵌入式(七)——第十三届省赛第一场真题
  9. 【C-函数】scanf函数原理
  10. java中奖率算法_Java抽奖概率算法