码迷,mamicode.com
首页 > 其他好文 > 详细

汇编写文件

时间:2015-08-19 23:49:54      阅读:314      评论:0      收藏:0      [点我收藏+]

标签:

  1. 下面的代码直接gcc 编译。用法 ./a.out file_name msg 命令行第一个参数是文件名,第二个参数是文件的内容

  2. 下面的代码说明了在汇编里怎么使用命令行参数(主函数用main而不是以前的_start,主函数写成main用64方式可以拿到内容)。

  3. 调用系统调用的方式改为64位的方式,貌类系统函数里面有指针类型的变量,32位调用方式就不行(64用syscall,32位用int 0x80 觖发系统调用)。

  4. 32位系统调用编号表/usr/include/asm/unistd_32.h

    64位系统调用编号表/usr/include/asm/unistd_64.h

.section .data
.section .bss
.section .text

.equ SYS_WRITE64, 1
.equ SYS_OPEN64,  2
.equ SYS_CLOSE64, 3
.equ SYS_EXIT, 1
.equ SYS_O_WRONLY_O_TRUNC_O_CREAT, 01101
.equ LINUX_SYSCALL, 0x80

.global main
main:
    #从命令行获得文件名,及内容 ./a.out "test" "ni hao"
    cmpl $1, %edi
    je _start_end

    #buffer 长度
    movq 16(%rsi), %rdi
    call strlen
    pushq %rax

    #buffer地址
    pushq 16(%rsi)

    #文件名
    pushq 8(%rsi)
    call write_file
    addl $8, %esp
    
_start_end:
    movl $SYS_EXIT, %eax
    xorl %ebx, %ebx
    int $LINUX_SYSCALL

.type write_file, @function
write_file:
    pushq %rbp
    movq %rsp, %rbp
    #取得第一个参数, 文件名
    movq 16(%rbp), %rdi
    #取得第二个参数, buffer 地址
    movq 24(%rbp), %rsi
    #取得第三个参数, buffer 长度
    movq 32(%rbp), %r8

    pushq %rsi
    #调用open
    movl $SYS_OPEN64, %eax
    movl $SYS_O_WRONLY_O_TRUNC_O_CREAT, %esi
    movl $0644, %edx
    syscall

    #检查返回值
    cmpl $0, %eax
    jl write_file_end

    popq %rsi
    movq %rax, %r9 #fd

    #调用write

    movl $SYS_WRITE64, %eax
    movq %r9, %rdi
    movq %r8, %rdx
    syscall

    #调用close
    movl $SYS_CLOSE64, %eax
    movq %r9, %rdi
    syscall
write_file_end:
    movq %rbp, %rsp
    popq %rbp
    ret


汇编写文件

标签:

原文地址:http://my.oschina.net/guonaihong/blog/494816

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!