汇编语言

环境

VMWare Workstation Ubuntu14.04 32位操作系统
输入whereis nasm查看是否下载有nasm,如果没有则会显示nasm:,有则会显示路径
如果没有下载,可以通过sudo apt install nasm下载,此时再输入whereis nasm就会显示路径了。不知道是原来自带还是这样就好了,输入nasm -version有具体的版本信息,安装ok。

指示符

指示符普遍的应用有:
1、定义常量
2、定义用来储存数据的内存
3、将内存组合成段
4、有条件地包含源代码
5、包含其它文件
NASM代码像C一样要通过一个预处理程序。它拥有许多和C一样的预处理程序。但是,NASM 的预处理的指示符以%开头而不是像C一样以#开头

equ 指示符

equ指示符可以用来定义一个符号。符号被命名为可以在汇编程序里使用的常量。

1
symbol equ value

符号的值以后不可以再定义。

%define 指示符

这个指示符和C中的#define非常相似。它通常用来定义一个宏常量,像在C里面一样。

1
2
%define SIZE 100
mov eax, SIZE

宏可以被再次定义而且可以定义比简单的常量数值更大的值

数据指示符

第一种方法仅仅为数据定义空间

第一种方法使用RESX指示符中的一个。X可由字母替代,字母由需要储存的对象的大小来决定。
字节 B
字 W
双字 D
四字 Q
十字 T

1
resb 1 ;一个未初始化的字节

第二种方法(同时定义一个初始值)使用DX指示符中的一个

X可以由字母替代,字母的值与RESX里的值一样。使用变量来标记内存位置是非常普遍的。变量使得在代码中指向内存位置变得容易

1
2
3
example1 db 0 ;字节变量,初始值为0
example2 dw 1000 ;字变量,初始值为1000
example3 dw 10h/10b ;可以跟其他进制的数字

单引号和双引号等效
连续定义的数据存储再连续的内存中

1
2
db 'h', 'i', 0  ;定义了一个字符串"hi"
db 'hi', 0 ;和上面等效

指示符DD可以用来定义整形和单精度的浮点数常量
DQ指示符仅仅可以用来定义双精度的数常量

nasm的times会重复操作数一个指定的次数,对于大的序列而言比较有用

1
times 100 db 0 ;100个值为0的字节

变量

变量可以用来表示代码中的数据,使用方法有两种

方法一

如果一个变量被调用(不加其他什么东西),它被解释为数据的地址(或偏移)

1
mov al, L1 ;此时的L1是L1所在的地址

方法二

如果变量被放置在方括号([])中,它就被解释为在这个地址中的数据

1
mov al, [L1] ;此时表示L1对应地址的数据

汇编程序并不保持跟踪变量的数据类型