codecamp

Assembly 指示符

指示符是由汇编程序产生的而不是由CPU产生。它们通常用来要么指示汇编程序做什么要么提示汇编程序什么。它们并不翻译成机器代码。指示符普遍的应用有:


1、定义常量

2、定义用来储存数据的内存

3、将内存组合成段

4、有条件地包含源代码

5、包含其它文件


NASM代码像C一样要通过一个预处理程序。它拥有许多和C一样的预处理程序。但是,NASM 的预处理的指示符以%开头而不是像C一样以#开头。


equ 指示符

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

symbol equ value

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

%define 指示符

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

%define SIZE 100
         mov     eax, SIZE

上面的代码定义了一个称为SIZE的宏通过使用一个MOV指令。宏在两个方面比符号要灵活。宏可以被再次定义而且可以定义比简单的常量数值更大的值。

数据指示符

数据指示符使用在数据段中用来定义内存空间。保留内存有两种方法。第一种方法仅仅为数据定义空间;第二种方法在定义数据空间的同时给与一个初始值。第一种方法使用RESX指示符中的一个。X可由字母替代,字母由需要储存的对象的大小来决定。表1.3给出了可能的值。

resx和dx指示符的字母

第二种方法(同时定义一个初始值)使用DX指示符中的一个。X可以由字母替代,字母的值与RESX里的值一样。使用变量来标记内存位置是非常普遍的。变量使得在代码中指向内存位置变得容易。下面是几个例子:

DX指示符

双引号和单引号被同等对待。连续定义的数据储存在连续的内存中。也就是说,字L2就储存在L1的后面。内存的顺序可以同样被定义。

定义内存的顺序

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

对于大的序列,NASM 的TIMES 指示符常常非常有用。这个指示符每次都重复它的操作对象一个指定的次数。例如:

NASM 的TIMES 指示符

记住变量可以用来表示代码中的数据。变量的使用方法有两种。如果一个平常的变量被使用了,它被解释为数据的地址(或偏移)。如果变量被放置在方括号([])中,它就被解释为在这个地址中的数据。换句话说,你必须把变量当作一个指向数据的指针而方括号引用这个指针就像*号在C中一样。(MASM/TASM使用的是另外一个惯例。)在32位模式下,地址是32位。这儿有几个例子:

变量

例子的第7行展示了NASM 一个重要性能。汇编程序并不保持跟踪变量的数据类型。它由程序员来决定来保证他(或她)正确使用了一个变量。随后它一般将数据的地址储存到寄存器中,然后像在C中一样把寄存器当一个指针变量来使用。同样,没有检查使得指针能正确使用。以这种方式,汇编程序跟C相比有更易出错的倾向。

考虑下面的指令:

mov    [L6], 1                     ; 储存1到L6中

这条语句产生一个operation size not specified(操作大小没有指定)的错误。为什么?因为汇编程序不知道是把1当作一个字节,还是字,或是双字来储存。为了修正这个,加一个大小指定:

mov    dword [L6], 1             ; 储存1到L6中

这个告诉汇编程序把1储存在从L6开始的双字中。另一些大小指定为:BYTE(字节),WORD(字),QWORD(四字)和TWORD(十字节)。


计算机汇编语言和指令操作
Assembly 输入输出和调试
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }