汇编语言结构

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

;  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字符创的长度。

原文地址:https://www.cnblogs.com/wangshuo/p/1987844.html