编译和以前一样: - 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 本文地址:http://linux.cn/article-3254-1.html |