分享
 
 
 

一起学习在linux下使用汇编语言(5)

王朝system·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

作者:luster

摘要:好吧,我们已经铺垫了很多东西了,而且看上去用汇编写程序似乎是一个非常恐怖的事情了。不过既然我们感爱好,还是应该开始我们的“hello world”程序。

5. 我们开始写hello world吧

好吧,我们已经铺垫了很多东西了,而且看上去用汇编写程序似乎是一个非常恐怖的事情了。不过既然我们感爱好,还是应该开始我们的“hello world”程序。

下面的代码中,我们预备采取直接使用内核中的系统调用的方法,这是调用系统内核服务的最快的方法,我们的代码不链接到其他函数库,也不使用ELF解释器,而是直接和内核通讯。

我们分别使用nasm和gas两种汇编器来编译我们的程序,这样我们可以看到Intel和AT&T两种语法格式了。

使用的工具

当然首先我们需要汇编编译器nasm和gas。然后我们需要链接器-ld,因为汇编编译器是生成的只是object代码。一般的发行包的binutils里面包括了gas和ld这两个实用工具。而对于大多数的发行包(例如,Debian,SuSe,Mandrake)都有nasm。

Hello, world!

Linux是一个32位的,运行在保护模式下的操作系统,使用的是flat memory 模式,使用ELF格式的二进制代码。

一个程序可以划分为下面几个部分: .text,.data,.bss。.text是一些只读的代码,.data是可读可写的数据区,.bss则是可读可写的没有初始化的数据区。当然可以有其他一些标准的部分,也可以使用户自己定义的sections,但是我们这里不关心。一个程序至少有.text部分。

下面就是我们的第一个程序“hello,world”。我们给出两个版本,分别是nasm和gas两种。

NASM (hello.asm)

--------------

section .data ;section declarationmsg db "Hello, world!",

0xa ;our dear stringlen equ $ - msg ;length of our dear stringsection .text ;

section declaration ;we must eXPort the entry point to the ELF linker

or global _start ;loader. They conventionally recognize _start as their ;

entry point. Use ld -e foo to override the default._start:;write our string

to stdout mov edx,len ;third argument: message length mov ecx,msg ;second

argument: pointer to message to write mov ebx,1 ;first argument: file handle

(stdout) mov eax,4 ;system call number (sys_write) int 0x80 ;call kernel;

and exit mov ebx,0 ;first syscall argument: exit code mov eax,1 ;system

call number (sys_exit) int 0x80 ;

call kernel

GAS (hello.S)

--------------

.data # section declarationmsg: .string "Hello, world! "

# our dear string len = . - msg # length of our dear string.text

# section declaration # we must export the entry point to the ELF linker or

.global _start # loader. They conventionally recognize _start as their

# entry point. Use ld -e foo to override the default._start:

# write our string to stdout movl $len,%edx # third argument:

message length movl $msg,%ecx # second argument: pointer to message to

write movl $1,%ebx # first argument: file handle (stdout) movl $4,%eax

# system call number (sys_write) int $0x80 # call kernel# and exit movl

$0,%ebx # first argument: exit code movl $1,%eax # system call number

(sys_exit) int $0x80 # call kernel

建立可运行的程序

要生成一个可执行的代码,首先就是用源代码编译生产一个object文件。

对于nasm,下面的语法:

$ nasm -f elf hello.asm

而对于gas,而用下面的语法:

$ as -o hello.o hello.S

这样就得到了hello.o这个object文件了。

然后我们就要使用这个object文件来生成可执行代码。这里使用链接器链接:

$ ld -s -o hello hello.o

这样我们就获得了我们的可以执行的代码“hello,world”。

我们的学习就告一段落了。更多的信息可以去参考:

http://linuxassembly.org/list

by Luster(luster@linuxaid.com.cn)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有