[008]C/C++系列 | 最小的程序 不一样的HelloWorld!!!_Zero Ice的博客-程序员宅基地

技术标签: 汇编  Centos7  [008]C/C++系列  最小程序  [013]操作系统原理系列  内嵌汇编  HelloWorld  

一、需求

  1.  日常的HelloWorld打印,需要用到C语言库里面的函数(printf),我们希望“小程序”脱离C语言库,使它成为一个独立于任何库的纯正“程序”

  2. 日常使用的程序,都是以main作为入口,现在我们自定义一个入口(nomain)

  3. 日常的HelloWorld会产生很多段,现在我们需要将所有的段合并到"tinytext"段

二、实现

2.1GCC内嵌汇编

int write(int filedesc, char* buffer, int size); 函数实现!!!

  • WRITE 调用号为4
  • filedesc表示被写入文件句柄,使用ebx寄存器传递,这里我们需要默认终端输出,它的句柄为0,ebx = 0
  • buffer表示要写入缓冲区地址,使用ecx寄存器传递,我们这里要输出字符串str,所以ecx = str
  • size 表示写入的字节数,使用edx寄存器传递,字符串str的长度为13, 所以edx = 13
void 
print()
{
    asm( "movl $13, %%edx \n\t"
         "movl %0, %%ecx \n\t"
         "movl $0, %%ebx \n\t"
         "movl $4, %%eax \n\t"
         "int $0x80     \n\t"
         ::"r"(str):"edx","ecx","ebx");
}

2.2结束进程

  • ebx 表示进程退出码(Exit Code)

  • EXIT系统调用的调用号为1,即eax = 1

void
exit()
{
    asm( "movl $42, %ebx  \n\t"
         "movl $1, %eax \n\t"   
         "int $0x80  \n\t");
}

备注:

 当执行完程序之后,如果想打印程序执行的退出码,可以这样子操作:

$ echo $?

 三、实现


/*
 * ld.c
 * Copyright (C) 2020 root <[email protected]>
 *
 * Distributed under terms of the MIT license.
 */

char *str = "Hello World!\n";

void 
print()
{
    asm( "movl $13, %%edx \n\t"
         "movl %0, %%ecx \n\t"
         "movl $0, %%ebx \n\t"
         "movl $4, %%eax \n\t"
         "int $0x80     \n\t"
         ::"r"(str):"edx","ecx","ebx");
}

void
exit()
{
    asm( "movl $42, %ebx  \n\t"
         "movl $1, %eax \n\t"   
         "int $0x80  \n\t");
}

void 
nomain()
{
    print();
    exit();
} 

四、编译&链接

$ gcc -c -fno-builtin  ld.c
$ ld -static -e nomain -o ld ld.o

4.1常见错误

原因:

在64位系统下去编译32位的目标文件,这样是非法的。

解决办法:

用”-m32”强制用32位ABI去编译

$ gcc -c -fno-builtin -m32 ld.c

 

4.2 链接错误

原因:

目标文件`ld.o’是32位系统的,在x86_64平台下默认链接用的是elf_x86_64.x,链接32位可执行文件使用的是elf32_x86_64.x

解决办法:

$ ld -static -m elf_i386 -e nomain -o ld ld.o

 

五、执行

 

六、改进

将多个端合并为一个段 !!!

 // ld.lds

ENTRY(nomain)

SECTIONS
{
    . = 0x08048000 + SIZEOF_HEADERS;
    tinytext : { *(.text) *(.data) *(.rodata) }
    /DISCARD/ : { *(.comment) }
}                                                                                                                   
  • ENTRY()指定程序入口
  • SECTIONS链接脚本主体
    • . = 0x08048000 + SIZEOF_HEADERS; . 表示当前虚拟地址;SIZEOF_HEADERS;为输出文件的文件头大小。 这里表示 将当前的虚拟地址设置成0x08048000 + SIZEOF_HEADERS 。  因为这条语句后面紧跟着输出段"tinytext",所以此段虚拟地址即为:0x08048000 + SIZEOF_HEADERS
    • tinytext : 转换规则。表示合并到tinytext
    • /DISCARD/ 丢弃.comment段
$ ld -static -T ld.lds -m elf_i386 -o ld ld.o

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_41593408/article/details/108621653

智能推荐

SVG潮流图__薄荷叶_的博客-程序员宅基地_潮流图svg

在PSSE中,可以指定母线并显示潮流信息图。根据这一思路,实现了基于SVG图形的动态潮流图自动生成功能。  在该潮流图中,可以点击任何一个母线(等值节点)来查看以该母线为基准的新的潮流图。在潮流图中,显示了母线电压、支路有功、支路无功信息。 2009-12-31 更新如下:1 添加了按电压等级着色功能2 添加了保存SVG图形功能 2010-02-01 更新如

CAD批量打印用什么工具比较好?_guduhuanzhe520的博客-程序员宅基地

http://blog.csdn.net/guduhuanzhe520/article/details/78499932

分布式中的 transaction log_hellozhxy的博客-程序员宅基地_transaction_order_serialize_log

分布式中的 transaction log在分布式系统中,有很多台node组成一个cluster,对于client 的一个写操作请求而言,在什么样的情况下,cluster告诉client此次写操作请求是成功的呢?首先来定义一下什么是写操作成功?假设有一个三节点的cluster,一个primary node,两个replica node如下图所示:方案1. client 向prima...

菜单的背景颜色_管哥的天下的博客-程序员宅基地

VC MFC菜单栏(CMenu)控件 (2011-07-02 12:49) 分类: C++ 菜单栏在对话框窗口里显示菜单栏像工具栏一样,菜单栏在按件面板里没有对应的选项,但有一个菜单控件类CMenu,所以如果想要在对话框里显示菜单栏,就得像工具栏那样,

吴恩达deeplearning.ai最后一课上线,下一次得等多少年?_AI科技大本营的博客-程序员宅基地

喜大普奔!今天,吴恩达的深度学习系列课程最后一课上线了!去年6月,吴恩达宣布deeplearning.ai创业项目,8月,该项目揭晓:一套由5门课组成的深度学习系列课程——Deep Learning Specialization,旨在推广普及深度学习知识。前3门课程一上线便引发了一股热潮,然而一直到11月,第4门课程才姗姗来迟,之后,吴老师又陷入了沉寂期,开始忙活自己的另外两个创业项目:L

随便推点

C项目敏捷实施-第一次迭代_wolf_linn的博客-程序员宅基地

 就这样,C项目组糊里糊涂的开始了敏捷之旅。在第一个迭代完成后:基本情况2011年2月21日-3月4日,项目组成员每天站在白板前进行每日站立会议。如果发现了需要讨论的话题,就在会后进行讨论。2011年3月4日,项目组进行了第一次回顾会议。没有评审会议了,因为项目组仅完成了预估工作的不到一半,仅提供了一个Demo。第一次回顾会议团队在白板前进行第一次迭代回顾,会议总耗时一个小...

gbk, gb2312,big5,unicode,utf-8,utf-16的区别详细介绍_老船长的博客-程序员宅基地

标题 谈谈Unicode编码,简要解释UCS、UTF、BMP、BOM等名词 选择自 fmddlmyy 的 Blog 关键字 谈谈Unicode编码,简要解释UCS、UTF、BMP、BOM等名词 这是一篇程序员写给程序员的趣味读物。所谓趣味是指可以比较轻松地了解一些原来不清楚的概念

Android Adb USB Socket 通信_码农000的博客-程序员宅基地_adb socket

这里写目录标题Android ADB 工作方式工作过程ADB 的原理ADB USB Socket 实现过程代码实现参考内容Android ADB 工作方式它是一种客户端-服务器程序,包括以下三个组件:客户端:用于发送命令。客户端在开发计算机上运行。您可以通过发出 adb 命令来从命令行终端调用客户端。守护进程 (adbd):在设备上运行命令。守护进程在每个设备上作为后台进程运行。服务器:管理客户端和守护进程之间的通信。服务器在开发机器上作为后台进程运行。工作过程当您启动某个 adb

[转载]能ping通但是不能打开网页问题的简单解决方法_离水的鱼。的博客-程序员宅基地

原文地址:能ping通但是不能打开网页问题的简单解决方法作者:周叶舟故障现象:  能ping通外网,还能上QQ,浏览器及本地连接的设置都没有问题,就是不能打开网页。打开360安全卫士不能连接至360云安全中心,用360安全卫士体验得分100,用360杀毒软件也查不出病毒,用360安全卫士的系统修复和实用工具的修复网络(LSP)都不能解决。  简单解决方法:  卸载...

【原创】【android逆向系列】1:真机(小米note 3)root(从本人简书博客移入)_远古某人的博客-程序员宅基地_android rom 逆向

本人学习android逆向有段时间了,之前一直使用模拟器学习,问题还挺多的,看到大家都说真机香,弄得我也心痒痒,故找了部之前用过的手机(小米note3),想root研究研究,可没想小米手机root,麻烦事还不少,所以便有了此篇文章~一、基础知识1.MIUI系统稳定版:小米手机出厂的系统,不提供ROOT功能开发版:自己下载ROM刷开发版的系统,才有ROOT授权2.解锁BLBL:bootloader,系统启动引导程序,早期小米手机没有BL锁,后来才加的,BL锁不解,ROM刷不进去###3.刷机方法

特征工程之特征关联_guangcheng0312q的博客-程序员宅基地_特征关联分析

特征工程之特征关联0.说在前面昨天学习了seaborn绘制图形,以及单变量与多变量之间的绘图,那么今天从统计学角度实战分析在处理特征工程过程中所涉及的三个相关系数(具体的三个系数数学推导,在后续更新)。为了更好的便于大家的交流,先建立一个微信总群,二维码在文章最后放出!【关键字】相关系数微信总群1.皮尔逊皮尔逊相关系数:Pearson correlation coeffici...

推荐文章

热门文章

相关标签