博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
汇编程序的Hello world
阅读量:5914 次
发布时间:2019-06-19

本文共 1334 字,大约阅读时间需要 4 分钟。

原文链接:

一、汇编程序的Hello world

 

x86 AT&T:

.data  msg:      .ascii "Hello world, hello AT&T asm!\n"      len = . - msg    .text  .global _start    _start:      movl    $len,   %edx    # 显示的字符数      movl    $msg,   %ecx    # 缓冲区指针      movl    $1, %ebx    # 文件描述符      movl    $4, %eax    # 系统调用号,_write      int $0x80       # 系统调用        movl    $0, %ebx    # 传给_exit的参数      movl    $1, %eax    # 系统调用号,_exit      int $0x80       # 系统调用

然后汇编链接再执行:

这段汇编相当于:

#include 
char msg[14] = "Hello,world!\n";#define len 14int main(void){    write(1, msg, len);    _exit(0);}

    .data段有一个标号msg,代表字符串“Hello,world!\n”的首地址,相当于C程序的一个全局变量。在汇编指示.ascii定义的字符串末尾没有隐含的‘\0’。汇编程序中的len代表一个常量,它的值由当前地址减去符号msg所代表的地址得到,换句话说就是字符串“Hello,world!\n”的长度。现在解释一下这行代码中的.,汇编器总是从前到后把汇编代码转换成目标文件,在这个过程中维护一个地址计数器,当处理到每个段的开头时把地址计数器置成0,然后每处理一条汇编指示或指令就把地址计数器增加相应的字节数,在汇编程序中用.可以取出当前地址计数器的值,是一个常量。

    在_start中调了两个系统调用,第一个是write系统调用,第二个是以前讲过的_exit系统调用。在调write系统调用时,eax寄存器保存着write的系统调用号4,ebx、ecx、edx寄存器分别保存着write系统调用需要三个参数。ebx保存着文件描述符,进程中每个打开的文件都用一个编号来标识,成为文件描述符,文件描述符1表示标准输出,对应的C标准I/O库的stdout。ecx保存着输出缓冲区的首地址。edx保存着输出的字节数。write系统调用把从msg开始的len个字节写到标准输出。

    C代码中的write函数是系统调用的包装函数,其内部实现就是把传进来的三个参数分别赋给ebx、ecx、edx寄存器,然后执行movl $4,%eax和int $0x80两指令。这个函数不可能完全用C代码写,因为任何C代码都不会编译生成int指令,所以这个函数有可能完全用汇编写的,也有可能是C用内联汇编写的,甚至是一个宏定义。_exite函数野史如此。

转载于:https://www.cnblogs.com/orlion/p/5316519.html

你可能感兴趣的文章
数据可视化之 Sankey 桑基图的实现
查看>>
项目实战-Api的解决方案
查看>>
前端面试题总结
查看>>
(三)从jvm层面了解线程的启动和停止
查看>>
SOA和微服务之间的区别
查看>>
IBM提出8位深度网络训练法,提速4倍同时保持高精度
查看>>
苹果发布Core ML 2
查看>>
“智能云”战略新品震撼发布,开发者如何快速上手?
查看>>
华为吴晟:分布式监控系统的设计与实现
查看>>
[deviceone开发]-do_Webview的基本示例
查看>>
亚马逊Alexa借助神经网络生成播音员声音
查看>>
比特大陆新一轮裁员50%,回应称系人员调整
查看>>
将 Measurements 和 Units 应用到物理学
查看>>
如何确定所运行的 SQL Server 2005 的版本?
查看>>
我的友情链接
查看>>
自动化安装Mysql5.6-脚本实现
查看>>
分布式事务:不过是在一致性、吞吐量和复杂度之间,做一个选择
查看>>
【云图】如何设置支付宝里的家乐福全国连锁店地图?
查看>>
对于json_lib包的使用
查看>>
scala可变长度参数(二)
查看>>