汇编语言学习09 之数据操作运算符指令

本文主要参考此网站内容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
发布了16 篇原创文章 · 获赞 0 · 访问量 317

猜你喜欢

转载自blog.csdn.net/qq_43156233/article/details/103836643
今日推荐