NASM汇编教程翻译07 第七讲 换行符
英文原版地址: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 第七讲 换行符相关推荐
- NASM汇编教程翻译09 第九讲 用户输入
英文原版地址:NASM Assembly Language Tutorials - asmtutor.com 介绍BSS段 目前为止我们已经用了text段和data段,现在介绍下BSS段.BSS代表以 ...
- NASM汇编教程翻译03 第三讲 计算字符串长度
英文原版地址:NASM Assembly Language Tutorials - asmtutor.com 背景知识 为什么我们需要计算字符串长度? sys_write要求我们传递指向内存中我们想要 ...
- Away3D 4.0官网教程(翻译)
使用Away3D 4.Stage3D 创建3D游戏和应用程序 (此帖每天都会更新,一定让大家完全的搞明白) 补充区: 'vase.awd' 可以使用 Prefab3D打开(在帖子后面回复 ...
- linux 自启动服务 SYSV,技术|LFCS 系列第七讲:通过 SysVinit、Systemd 和 Upstart 管理系统自启动进程和服务...
几个月前, Linux 基金会宣布 LFCS (Linux 基金会认证系统管理员) 认证诞生了,这个令人兴奋的新计划定位于让来自全球各地的初级到中级的 Linux 系统管理员得到认证.这其中包括维护已 ...
- NASM汇编初探(入门教程)
Learn Assembly Language 文章目录 Learn Assembly Language 1. Lesson 1 Hello, world! 1.1 Background 1.2 Wr ...
- 32位汇编第七讲,混合编程,内联汇编
32位汇编第七讲,混合编程 博客园IBinary原创 QQ:2510908331 博客连接:http://www.cnblogs.com/iBinary/ 转载请注明出处,谢谢 混合编程的概念,有时 ...
- 《ArcGIS Engine+C#实例开发教程》第七讲 图层符号选择器的实现2
<ArcGIS Engine+C#实例开发教程>第七讲 图层符号选择器的实现2 原文:<ArcGIS Engine+C#实例开发教程>第七讲 图层符号选择器的实现2 摘要:在第 ...
- 计算机专业英语被动语态举例,第七讲被动语态的译法_计算机专业英语教程
第七讲被动语态的译法_计算机专业英语教程 第七讲 被动语态的译法 (Translation of Passive Voice) 被动语态在英语中,特别是科技英语中运用得非常广泛,而汉语的被动句则用得较 ...
- Deep Learning 教程翻译
Deep Learning 教程翻译 非常激动地宣告,Stanford 教授 Andrew Ng 的 Deep Learning 教程,于今日,2013年4月8日,全部翻译成中文.这是中国屌丝军团,从 ...
最新文章
- 【蓝桥java】进制与整除之尼姆堆
- 将一个PPT文档按页分割成多个PPT文档的代码
- Codeforces Round 263(Div. 2)
- wdcp mysql密码_wdcp默认的mysql密码是多少?
- java returnaddress,JVM之数据类型
- Java中带标签的break,continue
- java类型之间的转换_JAVA基本数据类型及之间的转换
- 解决phpcms模版设置中不能显示栏目首页模板,栏目列表页模板,内容页模板等下拉菜单选项的问题!...
- ajax中POST请求与参数(请求体)设置
- r k-means 分类结果_《机器学习》之 Kmeans聚类的原理及代码
- 怎样更改itunes备份位置_iphone备份太大,严重挤占C盘空间,怎么把备份放在其他的硬盘?...
- JSP学习 三大指令、九个内置对象、JavaBean、EL表达式
- 使用OpenResty搭建高性能服务端
- java 省市县数据_Jsoup获取全国地区数据(省市县镇村)
- 【六维空间】即将免费开放注册
- Vue中使用echarts,echarts 封装以及使用的事项
- dns被劫持怎么办?网页总是跳转到别的、你的DNS可能被劫持了!
- 相濡以沫,何能相忘于江湖
- cts测试如何跳过某个模块不测过
- 【观察】从社恐症到社牛症,有一台微软Surface就够了
热门文章
- springboot+layui样式加载不进来No mapping for GET /layui/css/layui.css
- 滨州学院CSDN高校俱乐部第二次公开课——微信公众平台开发SAE使用
- vscode怎么快速打不是html标签的双标签呢?比如vue里面的自定义双标签
- 关于TFT LCD屏ST7735S驱动移植STM32HAL库的部分问题总结
- python中yield语句的作用_Python中关键字yield有什么作用
- 当前网友眼中越老越吃香的行业到底是什么?
- 1018 锤子剪刀布 (20 分)(算法分析+代码实现)
- 突击蓝桥杯嵌入式(七)——第十三届省赛第一场真题
- 【C-函数】scanf函数原理
- java中奖率算法_Java抽奖概率算法