linux简单之美(二)

    我们在前一章中看到了如何仅仅用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

时间: 2024-09-17 04:37:46

linux简单之美(二)的相关文章

linux简单之美(三)

在linux简单之美(二)中我们尝试使用了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 0x8

linux简单之美

linux简单之美 (一) 话说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,

linux简单之美(一)

    话说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 in

Linux内核分析(二)----内核模块简介|简单内核模块实现

原文:Linux内核分析(二)----内核模块简介|简单内核模块实现 Linux内核分析(二) 昨天我们开始了内核的分析,网上有很多人是用用源码直接分析,这样造成的问题是,大家觉得很枯燥很难理解,从某种意义上来说linux系统本身就是由一个个模块构成的,所以我会结合内核模块的设计,去分析内核,从而达到对linux内核的理解. 今天我们会分析到以下内容: 1.      Linux内核模块简介 2.      简单内核模块实现   l  Linux内核模块简介 1.       何为内核模块 在上

9条Linux简单又实用的指令介绍

  9条Linux简单又实用的指令介绍          今天,与大家分享的是学习Linux过程中的心得体会,写下来与大家分享. 1.指令:ls 说明:ls常常用于在Console界面下,查看当前目录下文件,其中包括文档.脚本.软件包等.类似于Windows资源管理器,可以快速便捷查看. 2.指令:cd 说明:在Linux系统下,常需要切换不同路径,查看.添加或者是运行脚本等.借助cd命令可以快速切换当前工作目录. 如下所示,借助cd,路径切换到 /Desktop目录下,借助ls可以查看Desk

[基础知识]Linux新手系列之二_unix linux

给Linux新手 [系列之二] OK,你的第一个问题是:什么是Linux,它和UNIX有什么区别?问这个问题的原因呢,多半是你还在大一的时候一次去实验室,看到高年纪学生在一个特大屏幕的机器上作题,你羡慕的看着他,问:"这是什么计算机啊,这么高级?"而他不无骄傲的说,"这是UNIX".后来你懂的多了,知道那是SUN工作站,上面运行着Solaris,就是UNIX.现在你又听说Linux也是UNIX,是怎么回事呢? short answer:去看书,街上很多Linux的书

Linux Device Tree(二):基本概念

一.前言 一些背景知识(例如:为何要引入Device Tree,这个机制是用来解决什么问题的)请参考引入Device Tree的原因,本文主要是介绍Device Tree的基础概念. 简单的说,如果要使用Device Tree,首先用户要了解自己的硬件配置和系统运行参数,并把这些信息组织成Device Tree source file.通过DTC(Device Tree Compiler),可以将这些适合人类阅读的Device Tree source file变成适合机器处理的Device Tr

Linux学习之CentOS(二)----远程登录管理工具SecureCRT的使用

[正文] 虚拟机版本:VMware Workstation_10.0.3 Linux系统版本:CentOS_6.5(64位) 一.前言: 前几天做了一回小白,安装了上个月发布的最新版CentOS 7 ,发现在学习的时候有很多地方和老版的CentOS不太一样,以至于出现了很多问题(当然,是对于我这种初学者而言),所以现在又重新装回了CentOS 6.5进行学习.我们直接进入正题吧. 当在VMware虚拟机中将CentOS安装成功后,会在win7系统中模拟出两个虚拟网卡:VMnet1和VMnet8,

驳“麦包包的简单SEO分析”二种观点

A5首页搜索专业里有一篇文章"管中窥豹:麦包包的简单SEO分析",其实昨天就看到了这篇文章,只是仅仅是一扫而过,无细读不成方圆啊,今天好好看了下这篇文章,发现除了第一点品牌和第四点流量之外,其他二点笔者都不是挺赞成的,所以才有了这篇文章"驳麦包包的简单SEO分析三种观点",多多交流才是一切吧. 首先呢,关于收录 原图:   现图:   从两张图中看到收录的差异性很大,可惜原作者并未截取百度权重流量估值,不然可以更好的对比一下了,其实昨天14号时候,百度的收录和反链一