汇编语言首先一定要写注释。
; 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字符创的长度。