美文网首页
Linux下使用汇编语言编写Hello,world!

Linux下使用汇编语言编写Hello,world!

作者: 海人为记 | 来源:发表于2016-11-09 16:02 被阅读1182次

    首先在编译器编写Hello,world!

        [section .data]         ;  // 数据在此
        strHello db "Hello,world!", 0Ah
        STRLEN equ $ - strHello
        [section .text]  ; // 代码在此
        global _start    ; // 我们必须导出 _start这个入口,以便让链接器识别
    
    _start:
        mov edx, STRLEN
        mov ecx, strHello
        mov ebx, 1
        mov eax, 4    ;  sys_write
        int 0x80         ;  系统调用
        mov ebx, 0
        mov eax, 1    ;  sys_exit
        int 0x80         ;  系统调用
    

    接下来,让我们在终端下使用命令行来进行编译,编译链接(每执行一步都用ls命令查看文件的增加情况):

    ~$ ls
    hello.asm
    ~$ nasm -f elf hello.asm -o hello.o  或者 nasm -f elf64 hello.asm
    ~$ ls
    hello.asm  hello.o
    ~$ ld -s -o hello.o -o hello
    ~$ ls
    hello  hello.asm  hello.o
    

    NASM的选项"-f elf"指定了输出文件的格式位ELF格式。
    链接选项“-s” 意味strip,可以去掉符号表等内容,可起到对生成的可执行代码减肥之功效。
    执行:

    ~$ ./hello
    Hello,world!
    

    成功!怎么样?很简单不是吗?
    我们回头看看代码,程序中定义了两个节(Section),一个放数据,一个放代码。在代码中值得注意的一点是,入口点默认是“_start”,我们不但要定义它。至于要通过global这个关键字将它导出,这样链接程序才能找到它。至于代码本身,你只需要知道它们是两个系统调用(如果你只接触过Windows变成,那么可认为系统调用相当于Windows编程中的API),用来显示字符串并退出就够了。至于为什么这么做倒不用深究,因为在我们自己的OS中根本用不到Linux的系统调用。

    相关文章

      网友评论

          本文标题:Linux下使用汇编语言编写Hello,world!

          本文链接:https://www.haomeiwen.com/subject/vdxauttx.html