Minix下的汇编

Wesley13
• 阅读 690

Minix下的汇编
大多数的编译器,如Turbo C/C++,Borland C/C++,M$ C/C++,GCC,VC+,编译过程都是"高级语言"->"asm"->"obj" .(当然TurboPascal是个例外,它能跳过生成asm文件这一段而直接生成目标代码).

Minix下的CC也不例外.

一般来说,minix启动时执行的第一段代码就位于mpx386.s中,但是#$%#$!@,怎么看不懂啊,虽说和它里面的几个mov,jmp都是老朋友了,可一看到里面那古里古怪的伪指令,我就找不着北了.上网查了半天,虽然没查到什么,但感觉English又进步了不少:P.

没办法,看来只有LIY(Learn It by Yourself,自学)了.

这里所说的"自学",不是平常说的那种抱着一本什么什么书看上半天的那种自学,那叫"自己学习",这里所说的自学,是"自己动手学".可是现在的问题是从哪里入手呢?我的第一反应是"Hello world!",不晓得你是什么反应:P.

第一,二段提到了,CC的编译过程是:src->asm->obj.对,就从这里入手,用CC将.c文件转换成.s文件.

先进入Minix,用man查看一下cc的使用说明,因为是查找和汇编有关的选项,所以我就用命令:# man cc | grep assem.于是屏幕上就显示出了带assem的几行,当然只有这一行是最有用的:"-S   Transform the input files to assembly files with suffix .s.".

那么现在就试试看,先来个Hello.c,代码很简单:int main(){printf("Hello world!");}.再将它转换成.s文件:"cc -S hello.c".OK,现在一个标准的.s的框架就出来了:

1]  .sect .text; .sect .rom; .sect .data; .sect .bss
2]  .extern _main
3]  .sect .text
4]  _main:
5]  push ebp
6]  mov ebp,esp
7]  push I_1
8]  call _printf
9]  pop ecx
10] leave
11] ret
12] .sect .rom
13] I_1:
14] .data4 1819043144
15] .data4 1870078063
16] .data4 560229490
17] .data4 0
18] .sect .text

好了,现在来分析一下这个.s文件的结构:

第1]行:sect应该是section的意思,那么.sect .text;就是说明一个代码段,.sect .data 是说明一个数据段(以初始化),.sect .bss 是说明一个数据段(末初始化),还有一个.sect .rom 搞不清,没关系,接着往下看:

第2]行:容易理解,说明了一个名为_main的标签.

第3]行:OK,代码要开始了.

第4]至11]行:不在本文的学习范围之内,跳过.

第12]至17]行:似乎这几行就是"Hello world!"的值.哦,明白了,.rom表示常量的意思.

行了,到了这里,一个简单的.s文件的框架就分析完了,如果还不满足的话,可以自己动手做做看:"do not try to memorize, learn by usage.".不过,在分析的过程中,千万不要在.c里面放个"#include <stdio.h>",至于是为什么,我在这里就不说了,自己试试看吧!

点赞
收藏
评论区
推荐文章
小万哥 小万哥
8个月前
掌握 C++ 编译过程:面试中常见问题解析
C编译过程C是一种高级编程语言,但是计算机并不能直接理解它。因此,需要将C代码翻译成计算机可以理解的机器语言。这个过程就是编译过程,是C程序从源代码到可执行文件的转换过程,包括预处理、编译、汇编和链接四个阶段。1.预处理在编译器开始编译之前
cpp加油站 cpp加油站
3年前
【工欲善其事,必先利其器】之怎么查看c++代码生成的汇编代码
本篇文章讲解怎么得到c代码对应的汇编代码,想要真正的理解一段代码到底是怎么执行的,还是要从汇编的层面去看,那怎么得到一段c代码所对应的汇编代码呢,下面为你介绍三种方式。1.gcc编译生成XXX.s文件一般来讲,给你一个cpp文件,比如test.cpp,然后我们编译都是直接gtest.cpp这样简单直接的方式,但其实它中间有很多个过程的,包含
Wesley13 Wesley13
3年前
GCC相关资料收集
GCC相关资料收集一、什么是GccLinux系统下的Gcc(GNUCCompiler)是GNU推出的功能强大、性能优越的多平台编译器,是GNU的代表作品之一。gcc是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比平均效率要高20%~30%。Gcc编译器能将C、C语言源程序、汇程式化序和目标程序编译、连接成可
Wesley13 Wesley13
3年前
C++ 编译过程简介
C/C程序编译流程:预处理编译汇编链接具体的就是:源代码(sourcecoprede)→预处理器(processor)→编译器(compiler)→汇编程序(assembler)→目标程序(objectcode)→链接器(Linker)→可执行程序(executables)C语言在linux下的基本流程如图:!wK
Wesley13 Wesley13
3年前
GCC编译过程记
GCC编译过程记一、引言   对于编程工作者来说,GCC是一个熟悉的名字,它的全称是“GNUCompilerCollection”。GCC是一组编译器集合,目前其支持C、C、ObjectiveC、ObjectiveC、Go和RBIG语言的编译。本篇博客主要总结使用GCC进行代码编译的方法以及从源文件生成
Wesley13 Wesley13
3年前
CMU
一、实验目的1.理解C语言程序的机器级表示。2.初步掌握GDB调试器的用法。3.阅读C编译器生成的x8664机器代码,理解不同控制结构生成的基本指令模式,过程的实现。二、实验工具1.SecureCRT2.Linux3.Objdump命令反汇编4.GDB调试工具
Wesley13 Wesley13
3年前
GNU
GNUas汇编在编译C语言程序时,GNUgcc编译器会首先输出一个作为中间结果的as汇编语言文件,然后gcc回调用as汇编器把这个临时汇编语言程序编译成目标文件。即实际上as汇编器最初是用于专门汇编gcc产生的中间汇编语言程序的,而非作为一个独立的汇编器使用(这也就是为什么你只调用gcc就能将你的c
Wesley13 Wesley13
3年前
20165305 苏振龙《信息安全系统设计基础》第一周学习总结
第一章:计算机系统漫游一、信息二进制(位串)上下文二、C语言代码转汇编代码命令:gccShello.iohello.s三、源程序翻译过程:源程序文本→预处理器(预处理)→编译器(编译)→汇编器(汇编)→链接器(链接)→可执行目标程序(二进制)四、了解编译系统工作原理的益处:1、优化程序性能2
小万哥 小万哥
1年前
C++编译器和链接器的完全指南
C是一种强类型语言,它的编译和链接是程序开发过程中不可或缺的两个环节。编译器和链接器是两个非常重要的概念。本文将详细介绍C中的编译器和链接器以及它们的工作原理和使用方法。编译器编译器是将源代码转换为可执行文件的程序。在C中,常用的编译器有GCC