linux简单之美
创始人
2024-03-01 12:51:55
0

(一)

话说windows也有syscall,这是必须的。但是win的syscall可以直接call吗?可以是

可以但是破费周折,搞成SDT之类的复杂概念。下面看看linux是如何做的吧。

section .data
msg db "hello hopy!",0x0a

section .text
global _start

_start:
	mov eax,4
	mov ebx,1
	mov ecx,msg
	mov edx,12
	int 0x80
	
	mov eax,1
	mov ebx,0
	int 0x80

关键是系统调用号要知道,开始找的是usr/include/asm-gen*/unistd.h,

可是都不对。后来找的是usr/include/x86_64_linux_gnu/asm/下的头文件,

有2个,分别对应x86和x64.、编译连接指令如下:

nasm -f elf main.asm
ld main.o

运行,段转储错误鸟,查了一下,本猫用的是x64位的linux,所以要生成

x64位的程序,或者指明是x86的程序,我选择后者:

ld -m elf_i386 -o main main.o

哦鸟!

(二)

我们在前一章中看到了如何仅仅用syscall做一些简单的事,现在我们看能不能直接调用

C标准库中的函数快速做一些"复杂"的事:

section .data
	ft db "now is %d",10

section .text
extern puts
extern exit
extern sleep
extern printf
global main

main:
	mov edi,11
again:	
	dec edi
	push edi
	push ft
	call printf
	
	push 1
	call sleep
	
	cmp edi,0
	jnz again

	push msg
	call puts
	
	push 0
	call exit
	
msg:
 db "happy xxx day!",0

以上代码功能很简单,从10倒数到0,然后打印一行,最后结束.与之前代码不同的是其中

调用了C标准库中的函数.编译和以前一样:

nasm -e elf main.asm

我们看看怎么连接:

gcc -m32 -o main main.o

好鸟!运行正常.

值得注意的是:我的OS是ubuntu64,而asm代码中是32位的,如果开始用

ld -m elf_i386 -lc -o main main.o

的方式,首先会提示找不到c库,这可以进入/usr/lib,然后使用

sudo ln -sv /lib/i386-linux-gun/libc.so.6 libc.so

创建软连接解决.

但在运行时提示无法找到可执行文件!该文件明明在的!

遂用gcc来连接,但要将_start改为main,还要装载32库

sudo apt-get install ia32-libs

还会提示找不到h文件,这时再装载库

sudo apt-get install g++-multilib

还有2族库,如有必要也可加载:

sudo apt-get install libc6:i386 libgcc1:i386 gcc-4.6-base:i386 
libstdc++5:i386 libstdc++6:i386
sudo apt-get install libc6-i386

最后要说的是,一些C代码在用std=c99编译时会发现提示无法获取结构大小,

这时改成如下即可:

gcc -D_GNU_SOURCE -std=c99 main.c

(三)

在(二)中我们尝试使用了C库的函数完成功能,那么能不能用syscall方式

来搞呢?显然可以!

section .data
	ft db "now is X",10

section .text
global _start

_start:
	mov edi,10
again:
	dec edi
	mov eax,edi
	add eax,0x30
	mov byte [ft+7],al

	mov eax,4
	mov ebx,1
	mov ecx,ft
	mov edx,9
	int 0x80

	mov eax,162
	push 0
	push 1
	mov ebx,esp
	mov ecx,0
	int 0x80
	
	cmp edi,0
	jnz again
	
	mov eax,4
	mov ebx,1
	mov ecx,msg
	mov edx,15
	int 0x80
	
	mov eax,1
	mov ebx,0
	int 0x80
	
msg:
 db "happy xxx day!",10

nasm -f elf main.asm
ld -m elf_i386 -o main main.o

在代码中延时使用的是nanosleep,其他和第一篇一致,只不过做了一个bin->ascii的小转换.

via: http://blog.csdn.net/mydo/article/details/8224352 http://blog.csdn.net/mydo/article/details/8452386 http://blog.csdn.net/mydo/article/details/8452417

相关内容

别只盯着Linux!90%...
当我们聊起“开源OS”,99%的人脑子里跳出Ubuntu、Arch...
2026-05-06 20:23:28
Fedora 44 正式发...
Fedora Linux 44 已正式发布,提供多种格式,支持多个...
2026-05-06 06:51:13
Steam Deck OL...
IT之家 5 月 3 日消息,据科技媒体 Phoronix 昨天报...
2026-05-06 06:49:39
支招航天实时Linux厂家...
在航空航天领域,底层操作系统是测控系统、星载设备、机载控制等核心装...
2026-04-10 22:20:21
Linux系统车载平板:打...
随着汽车智能化和车联网的发展,车载平板不再只是简单的显示和导航工具...
2026-04-09 15:11:12
华为「融合开发引擎」上线鸿...
IT之家 4 月 1 日消息,由华为终端开发的「融合开发引擎」目前...
2026-04-02 19:22:22

热门资讯

PHP最佳实践(译) 简介PHP是一门复杂的语言,经过多年折腾,使其不同版本之间高度不一致,有时还有些bug。 每个版本都...
值得收藏的 27 个机器学习的... 机器学习 ( Machine Learning ) 有很多方面,当我开始研究学习它时,我发现了各种各...
为什么计量 IT 的生产力如此... 在某些行业里,人们可以根据一些测量标准判定一个人的生产力。比如,如果你是一个零件制造商,可以通过一个...
8 个提升你的隐私防护的开源密... 使用一些顶级开源密码管理器,确保你的登录凭证安全无虞。密码管理器是一项非常有用的实用程序。在你想寻找...
硬核观察 #885 苹果 AR... 苹果 AR 眼镜被无限期推迟据报道,由于技术上的挑战,苹果公司已经无限期推迟了其轻型增强现实(AR)...
8个有趣的Linux提示与技巧... 我们时不时给你带来关于Linux的提示与技巧。和这个系列保持一致,这里有8个我们从读者收到最有趣的提...
Helix:高级 Linux ... 说到 基于终端的文本编辑器,通常 Vim、Emacs 和 Nano 受到了关注。这并不意味着没有其他...
2020 年的 GitHub ... 距离 2020 年结束只剩下区区 24 天,我们即将结束魔幻的 2020 ,迎来新的一年,新的一年或...
开源新闻速递:openSUSE... 今日关注openSUSE 项目组的 Dominique Leuenberger 在他的周报中说:“这...
KDE4.11 Beta1 正...   KDE 项目工作组刚刚发布了 KDE Software Compilation 4.11 Bet...