文档章节

汇编写文件

guonaihong
 guonaihong
发布于 2015/08/19 23:08
字数 374
阅读 210
收藏 4
  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


© 著作权归作者所有

guonaihong

guonaihong

粉丝 6
博文 83
码字总数 27591
作品 1
徐汇
程序员
私信 提问
汇编语言写的hellworld,在安卓手机上运行

西门吹雪原则 本文讲解如何写一个gnu arm的汇编程序,并且在安卓手机上运行起来。 图片来自网络 (一)为什么学arm汇编? 如果允许在使用时才去学的话,任何东西都不必提前学习。而“用时才学...

奇哥十年程序
2017/12/27
0
0
SylixOS内存错误排查方法

1.应用程序测试代码 测试代码如程序清单 1.1所示: 程序清单 1.1 #include int main (int argc, char **argv) { sleep(2); volatile int a = (int )0x40; //设置物理地址 printf("value = %x......

深山野老
2017/11/22
0
0
《汇编语言程序设计》学习笔记(4)四、汇编编程

4.1 80x86汇编编程-1 4.1.1 hello world-1 目录 Hello World 首先我们来看一下咱们 这个程序的主体 首先第一个吧 虽然我们没有详细的讲解过 一个完整的汇编程序的结构 但是从这张图上我们可以...

qq_33528613
2018/04/06
0
0
MASM32 SDK

MASM32 SDK是不同工具软件的大集合,它的汇编编译器用的是微软MASM软件包中的Ml.exe,资源编译器和32位链接器使用的是Microsoft Visual Studio中的Rc.exe和Link.exe,同时包含了Microsoft V...

匿名
2011/05/04
6.7K
1
编译——源程序是如何变成可执行文件的?

一:几个关键名词 1、编辑器:就是我们通常写代码的编辑工具,像notepad++ 等编辑工具,我们通过这类工具编辑我们想写的代码,所形成的文件称之为源文件; 2、预处理器:主要负责文本的替换、...

xholes
2017/03/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Kettle自定义jar包供javascript使用

我们都知道 Kettle 是用 Java 语言开发,并且可以在 JavaScript 里面直接调用 java 类方法。所以有些时候,我们可以自定义一些方法,来供 JavaScript 使用。 本篇文章有参考自:https://www...

CREATE_17
昨天
82
0
处理CSV文件中的逗号

我正在寻找有关如何处理正在创建的csv文件的建议,然后由我们的客户上传,并且该值可能带有逗号(例如公司名称)。 我们正在研究的一些想法是:带引号的标识符(值“,”值“,”等)或使用|...

javail
昨天
79
0
如何克隆一个Date对象?

将Date变量分配给另一个变量会将引用复制到同一实例。 这意味着更改一个将更改另一个。 如何实际克隆或复制Date实例? #1楼 简化版: Date.prototype.clone = function () { return new ...

技术盛宴
昨天
73
0
计算一个数的数位之和

计算一个数的数位之和 例如:128 :1+2+8 = 11 public int numSum(int num) { int sum = 0; do { sum += num % 10; } while ((num = num / 10) > 0); return sum;......

SongAlone
昨天
124
0
为什么图片反复压缩后普遍会变绿,而不是其他颜色?

作者:Lion Yang 链接:https://www.zhihu.com/question/29355920/answer/119088684 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 业余版概要:安卓的...

shzwork
昨天
71
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部