汇编入门<一>
汇编语言
环境
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 | %define SIZE 100 |
宏可以被再次定义而且可以定义比简单的常量数值更大的值
数据指示符
第一种方法仅仅为数据定义空间
第一种方法使用RESX指示符中的一个。X可由字母替代,字母由需要储存的对象的大小来决定。
字节 B
字 W
双字 D
四字 Q
十字 T
1 | resb 1 ;一个未初始化的字节 |
第二种方法(同时定义一个初始值)使用DX指示符中的一个
X可以由字母替代,字母的值与RESX里的值一样。使用变量来标记内存位置是非常普遍的。变量使得在代码中指向内存位置变得容易
1 | example1 db 0 ;字节变量,初始值为0 |
单引号和双引号等效
连续定义的数据存储再连续的内存中
1 | db 'h', 'i', 0 ;定义了一个字符串"hi" |
指示符DD可以用来定义整形和单精度的浮点数常量
DQ指示符仅仅可以用来定义双精度的数常量
nasm的times会重复操作数一个指定的次数,对于大的序列而言比较有用
1 | times 100 db 0 ;100个值为0的字节 |
变量
变量可以用来表示代码中的数据,使用方法有两种
方法一
如果一个变量被调用(不加其他什么东西),它被解释为数据的地址(或偏移)
1 | mov al, L1 ;此时的L1是L1所在的地址 |
方法二
如果变量被放置在方括号([])中,它就被解释为在这个地址中的数据
1 | mov al, [L1] ;此时表示L1对应地址的数据 |
汇编程序并不保持跟踪变量的数据类型