• 汇编语言结构


    汇编语言首先一定要写注释。

    ;  Excutable name : EATSYSCALL
    ;  Version        : 1.0
    ;  Created date   : 1/7/2009
    ;  Last update    : 2/18/2009
    ;  Author         : Jeff Duntemann
    ;  Description    : A simple program in assembly for Linux, using NASM 2.05,
    ;       demonstrating the use of Linux INT 80H syscalls to display text.
    ;
    ;  Build using these commands:
    ;    nasm -f elf -g -F dwarf eatsyscall.asm
    ;    ld -o eatsyscall eatsyscall.o
    ;

    用NASM编写的汇编程序一般分成三部分,.data  .ass  .text。这三部分的顺序不是很重要,但一般是按上述顺序来写。

    section .data(也可以写成SECTION)

            初始化的数据定义。

            load these data from disk to memory。

            这里的数据会增大你程序的大小。Linux会为这些数据分配内存空间。

    section .bss

            data buffers

            这里的数据如果很多的话也不会增大你程序的大小,因为iLinux只有在用的时候才会为这些数据分配内存空间。

    section .text

            acrual machine instruction

            “labels” to identify locations in the program code for jmps and calls

    labels:

    · labels必须以字母、下划线、句号或者问号开始。如ab  _ab   .ab    ?ab

    不过后面三种都是有特殊用途的,所以不要轻易使用。

    · 定义labels时,之后必须要有冒号

    · labels是大小写敏感的

     

    _start

    这个label是非常特殊的,代表程序的开始,有些像C语言中的main函数

    它是大小写敏感的,不能写成别的东西

    这个label必须被标记为global,并且位于.text的顶端

    global specifier告诉链接器从外面也可以看见_start标记

    SECTION .text                   ; Section containing code
            global _start           ; Linker needs this to find the entry point!


     

    Data definition directives look like this:(这是在.data部分的数据定义)
    MyByte db 07h ; 8 bits in size, “db” meas Define Byte
    MyWord dw 0FFFFh ; 16 bits in size, “dw” means Define Word"
    MyDouble dd 0B8000000h ; 32 bits in size, “dd” means Define Double”

     

    字符串定义(string):

    字符串的label只表示这个字符串的开始地址:

    EatMsg: db “Eat at Joe’s!“,10

    定义字符串是可以用双引号也可以用单引号,如果你定义的字符串本身含有双引号,外面就用单引号括起来:

    Yukkh: db 'He said, “How disgusting!“ and threw up.’,10

    几个分离的字串可以用逗号隔开,来定义一个更长的字符串:

    TwoLineMsg: db “Eat at Joe’s...“,10,“...Ten million flies can’t ALL be wrong!“,10

    那总在字符串中出现的10是什么意思呢?在Linux中,10代表End-Of-Line(EOF)。由于逗号连接两个子字符串,所以上面的定义就相当于在一个字符串的末尾又加了一个换行符。以后输出到终端上的内容就会在下一行最左边显示了。

    EQU:

    equ把一个数值赋给一个标签。有点类似C语言中的宏定义或者const值。

    EatLen equ 14

    assembly time是一个大的类型,常用的是用来计算一个字符串的长度

    NASM会创建一个中间文件.o文件,$这个符号表示的是NASM在这个文件中的位置。

    SECTION .data                   ; Section containing initialised data
    
            EatMsg: db "Eat at Joe's!",10
            EatLen: equ $-EatMsg

    在这个语句中,EatLen必须紧紧跟在EatMsg这个标签之后,中间能有其他的东西。

    EatMsg标记的是那个字符串的开始位置。在它之后,就是EatLen这个标签。

    当NASM走到标签EatLen时,$符号表示的就是EatMsg这个字符串之后的第一个位置。这样,$-EatMsg计算出来的值就是EatMsg字符创的长度。

  • 相关阅读:
    mysql数据库之多表查询
    mysql数据库之单表查询
    mysql数据库之表和库
    mysql数据库之windows版本
    mysql数据库之linux版本
    mysql数据库之mysql下载与设置
    python基础之逻辑题(3)
    python基础之逻辑题(2)
    python基础之逻辑题(1)
    spring boot统一异常处理
  • 原文地址:https://www.cnblogs.com/wangshuo/p/1987844.html
Copyright © 2020-2023  润新知