当前位置: 技术问答>linux和unix
我想在LINUX下编译啊诗玛(ASM),谁能介绍以下情况与经验?
来源: 互联网 发布时间:2014-12-11
本文导语: 手头没有相关教材。所有教材都是关于MSDOS的,其中教材中的多数例题在涉及到IO问题时都是简单的交给MSDOS去做。在LINUX下我该怎么办?难道把C源程序只编译到 xxx.s为止,再去看GCC写的汇编吗? | ...
手头没有相关教材。所有教材都是关于MSDOS的,其中教材中的多数例题在涉及到IO问题时都是简单的交给MSDOS去做。在LINUX下我该怎么办?难道把C源程序只编译到 xxx.s为止,再去看GCC写的汇编吗?
|
如果只是io操作,可以直接用欧outx,inx操作,x表示(b,w,l),可以看看man,记得,你必须是root,并且在io操作前调用iopl或者ioperm,iopl简单,但是危险大大的说,因为它开放所有io空间
一个例子
char r;
iopl(3);
outb(5, 0x3f);
r = inb(0x3cf);
iopl(0);
如果非要asm
可以使用nasm,它比较类似masm,至于gnu asm。看了都头大
例子:
section .text
msg db "Hello ASM!", 0dh, 0
section .code
global main
extern printf
main:
push ebp
mov ebp, esp
push msg
call printf
leave
ret
一个例子
char r;
iopl(3);
outb(5, 0x3f);
r = inb(0x3cf);
iopl(0);
如果非要asm
可以使用nasm,它比较类似masm,至于gnu asm。看了都头大
例子:
section .text
msg db "Hello ASM!", 0dh, 0
section .code
global main
extern printf
main:
push ebp
mov ebp, esp
push msg
call printf
leave
ret
|
可以直接嵌入 如下例
int main ()
{
__asm__
("
jmp 0x18 # 3 bytes
popl %esi # 1 byte
movl %esi,0x9(%esi) # 3 bytes
xorl %eax,%eax # 2 bytes
movb %eax,0x8(%esi) # 3 bytes
movl %eax,0xd(%esi) # 3 bytes
movb $0xb,%al # 2 bytes
movl %esi,%ebx # 2 bytes
leal 0x9(%esi),%ecx # 3 bytes
leal 0xd(%esi),%edx # 3 bytes
int $0x80 # 2 bytes
call -0x1d # 5 bytes
.string "/bin/sh" # 9 bytes
# 41 bytes total
");
}
int main ()
{
__asm__
("
jmp 0x18 # 3 bytes
popl %esi # 1 byte
movl %esi,0x9(%esi) # 3 bytes
xorl %eax,%eax # 2 bytes
movb %eax,0x8(%esi) # 3 bytes
movl %eax,0xd(%esi) # 3 bytes
movb $0xb,%al # 2 bytes
movl %esi,%ebx # 2 bytes
leal 0x9(%esi),%ecx # 3 bytes
leal 0xd(%esi),%edx # 3 bytes
int $0x80 # 2 bytes
call -0x1d # 5 bytes
.string "/bin/sh" # 9 bytes
# 41 bytes total
");
}
|
可以完全的ASM编程,用as汇编。