本文主要参考此网站内容http://c.biancheng.net/view/3476.html
INC 和 DEC 指令
INC(增加)和DEC(减少)指令分别表示寄存器或内存操作数加 1 和减 1。语法如下所示:
INC reg/mem
DEC reg/mem
例子:
.data
myWord WORD 1000h
.code
inc myWord ; myWord = 1001h
mov bx,myWord
dec bx ; BX = 1000h
根据目标操作数的值,溢岀标志位、符号标志位、零标志位、辅助进位标志位、进位标志位和奇偶标志位会发生变化。INC 和 DEC 指令不会影响进位标志位。
ADD
ADD 指令将长度相同的源操作数和目的操作数进行相加操作。语法如下:
ADD dest,source
在操作中,源操作数不能改变,相加之和存放在目的操作数中。该指令可以使用的操作数与 MOV 指令相同。下面是两个 32 位整数相加的短代码示例:
.data
val1 DWORD 10000h
val2 DWORD 20000h
.code
mov eax,val1 ; EAX = 10000h
add eax,val2 ; EAX = 30000h
标志位:进位标志位、零标志位、符号标志位、溢出标志位、辅助进位标志位和奇偶标 志位根据存入目标操作数的数值进行变化。
SUB指令
SUB 指令从目的操作数中减去源操作数。该指令对操作数的要求与 ADD 和 MOV 指令相同。指令语法如下:
SUB dest, source
下面是两个 32 位整数相减的短代码示例:
.data
var1 DWORD 30000h
var2 DWORD 10000h
.code
mov eax,var1 ;EAX = 30000h
sub eax,var2 ;EAX = 20000h
NEG 指令
NEG(非)指令通过把操作数转换为其二进制补码,将操作数的符号取反
执行算术表达式
使用 ADD、SUB 和 NEG 指令,就有办法来执行汇编语言中的算术表达式,包括加法、减法和取反。换句话说,当有下述表达式时,就可以模拟 C++ 编译器的行为:
Rval = -Xval + (Yval - Zval);
现在来看看,使用如下有符号 32 位变量,汇编语言是如何执行上述表达式的。
Rval SDWORD ?
Xval SDWORD 26
Yval SDWORD 30
Zval SDWORD 40
转换表达式时,先计算每个项,最后再将所有项结合起来。首先,对 Xval 的副本进行取反,并存入寄存器:
; first term: -Xval
mov eax,Xval
neg eax ; EAX = -26
然后,将 Yval 复制到寄存器中,再减去 Zval:
; second term: (Yval - Zval)
mov ebx,Yval
sub ebx,Zval ; EBX = -10
最后,将两个项(EAX 和 EBX 的内容)相加:
; add the terms and store:
add eax,ebx
mov Rval,eax ; -36
TYPE运算符:返回变量的大小
TYPE 运算符返回变量单个元素的大小,这个大小是以字节为单位计算的。比如,TYPE 为字节,返回值是 1;TYPE 为字,返回值是 2;TYPE 为双字,返回值是 4;TYPE 为四字,返回值是 8。示例如下:
.data
var1 BYTE ?
var2 WORD ?
var3 DWORD ?
var4 QWORD ?
下表是每个 TYPE 表达式的值:
LENGTHOF运算符:计算数组中元素的个数
LENGTHOF 运算符计算数组中元素的个数,元素个数是由数组标号同一行出现的数值来定义的。示例如下:
.data
byte1 BYTE 10,20,30
array1 WORD 30 DUP (?),0,0
array2 WORD 5 DUP(3 DUP(?))
array3 DWORD 1,2,3,4
digitStr BYTE "12345678",0