08月25, 2018

在x64的Linux下编写运行32位汇编

我们使用汇编器as和链接器ld即可。

使用如下方法进行汇编和链接:

as --32 -o test.o test.s
ld -m elf_i386 -o test test.o

如果要调用libc,需要先安装32位的libc,例如sudo apt-get install libc6:i386

这时的汇编和链接方法如下:

as --32 -o test.o test.s
ld -dynamic-linker /lib/ld-linux.so.2 -m elf_i386 -o test test.o /lib/i386-linux-gnu/libc.so.6

不过最好是给libc做个软链接:sudo ln -s /lib/i386-linux-gnu/libc.so.6 /lib/i386-linux-gnu/libc.so,链接就直接ld -lc -dynamic-linker /lib/ld-linux.so.2 -m elf_i386 -o test test.o即可。

几个示例程序:

输出所有命令行参数:

.text
.globl _start

_start:
    popl %ecx
vnext:
    popl %ecx
    test %ecx, %ecx
    jz exit
    movl %ecx, %ebx
    xorl %edx, %edx
strlen:
    movb (%ebx), %al
    inc %edx
    inc %ebx
    test %al, %al
    jnz strlen
    movb $10, -1(%ebx)
    movl $4, %eax
    movl $1, %ebx
    int $0x80
    jmp vnext
exit:
    movl $1, %eax
    xorl %ebx, %ebx
    int $0x80

输出cpuid信息:

.section .data
output:
        .asciz "The processor vendor id is '%s'\n"
.section .bss
        .lcomm buffer, 12
.section .text
.globl _start
_start:
        movl $0, %eax
        cpuid
        movl $buffer, %edi
        movl %ebx, (%edi)
        movl %edx, 4(%edi)
        movl %ecx, 8(%edi)
        push $buffer
        push $output
        call printf
        addl $8, %esp
        push $0
        call exit

本文链接:https://debug.fanzheng.org/post/write-and-run-32-bits-assembly-on-linux-x64.html

-- EOF --

Comments

评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。