1. move
move target source
单条move指令不能把数据从一个内存位置移到另一个内存位置,可以先把数据送到一个寄存器中
mov ax var1
mov var2 ax
var1 and var2 都是内存位置,不能 mov var2 var1
在复制数据到寄存器时,必须考虑到它需要的最少字节数
2. movzx and movsx
3. LAHF 指令将EFLGS寄存器的低字节复制到AH寄存器,被复制的标志包括符号标志,零标志,进位标志,奇偶标志和进位标志
.data
lahf ;状态标志送至AH
mov saveflags,ah ;状态标志保存在变量中
3. SAHF 指令复制AH寄存器的值到 EFLAGS 寄存器的低字节
move ah,saveflags
sahf
4. XCHG 交换两个操作数的内容
XCHG reg,reg
5. 直接偏移操作数
arrayB+1, 被称为有效地址, 有效地址以方括号括起来时 表示要对方括号内的表达式寻址以获取该有效地址内存的内容
MASM并不要求一定要使用方括号,因此下面是等价
mov al, [arrayB+1]
mov al, arrayB+1
5. INC DEC 加1或减1
6. ADD SUB
7. NEG 将数字转换为对应的补码而求其相反数
8. 标志位
ZF,CF,AC,PF,SF,DF
9. 和数据相关的操作符和伪指令
OFFSET
PRT
TYPE 返回数组中每个元素的大小(以字节计算)
LENGTHOF 操作数返回数组内元素的数组
sizeof 操作符返回数组初始化占用的字节数
10,
假设bVal位于00404000处
mov esi, offset bVal ; ESI = 00404000
esi 一般用来保存小一条指令的地址,
mov esi, OFFSET myArray + 4
11 ALIGN
对齐指令
12, PTR
myDouble DWORD 12345678h
mov ax, myDouble 错误, 32 不能送到 16位寄存器中
但word PRT可以将低字节5678H送到AX
mov ax,WORD PTR [myDouble+2] ; 1234h
mov bl,bypte ptr mydouble; 78h
将两个较小值送到较大的目的操作数
wordList WORD 5678h,1234h
mov eax, DWORD PRT wordList; EAX= 12345678H
13. TYPE
14, LENGTHOF 数组中的元素的数组
15, sizeof 返回值等于 LENGTHOF 和 TYPE 返回值的 乘积
intArray WORD 32 DUP(0)
mov eax,SIZEOF intArray ; EAX = 64
16, 间接寻址
处理数组唯一可行的方法是用寄存器作为指针并操作寄存器的值,这称为间接寻址
17,
18 变址操作数
把常量和寄存器相加得到一个有效地址
19. TYPEDEF
创建了一种新的数据类型--指向字节的指针PBYTE
PBYTE TYPEDEF PRT BYTE
20 jmp
21 LOOP
循环结束时 AX =5, ECX = 0;
22 数组求和
23 在JAVA中,如果向ArrayList添加元素时超过了容量,运行系统会重新分配一块新的内存,并把原来的数据复制到新地址,同事删除原来的数据
move target source
单条move指令不能把数据从一个内存位置移到另一个内存位置,可以先把数据送到一个寄存器中
mov ax var1
mov var2 ax
var1 and var2 都是内存位置,不能 mov var2 var1
在复制数据到寄存器时,必须考虑到它需要的最少字节数
2. movzx and movsx
3. LAHF 指令将EFLGS寄存器的低字节复制到AH寄存器,被复制的标志包括符号标志,零标志,进位标志,奇偶标志和进位标志
.data
lahf ;状态标志送至AH
mov saveflags,ah ;状态标志保存在变量中
3. SAHF 指令复制AH寄存器的值到 EFLAGS 寄存器的低字节
move ah,saveflags
sahf
4. XCHG 交换两个操作数的内容
XCHG reg,reg
5. 直接偏移操作数
arrayB BYTE 10h,20h,30h
mov al,arrayB ; AL=10H
mov al,[arrayB+1] AL=20H
arrayB+1, 被称为有效地址, 有效地址以方括号括起来时 表示要对方括号内的表达式寻址以获取该有效地址内存的内容
MASM并不要求一定要使用方括号,因此下面是等价
mov al, [arrayB+1]
mov al, arrayB+1
5. INC DEC 加1或减1
6. ADD SUB
7. NEG 将数字转换为对应的补码而求其相反数
8. 标志位
ZF,CF,AC,PF,SF,DF
9. 和数据相关的操作符和伪指令
OFFSET
PRT
TYPE 返回数组中每个元素的大小(以字节计算)
LENGTHOF 操作数返回数组内元素的数组
sizeof 操作符返回数组初始化占用的字节数
10,
假设bVal位于00404000处
mov esi, offset bVal ; ESI = 00404000
esi 一般用来保存小一条指令的地址,
mov esi, OFFSET myArray + 4
11 ALIGN
对齐指令
12, PTR
myDouble DWORD 12345678h
mov ax, myDouble 错误, 32 不能送到 16位寄存器中
但word PRT可以将低字节5678H送到AX
mov ax,WORD PTR [myDouble+2] ; 1234h
mov bl,bypte ptr mydouble; 78h
将两个较小值送到较大的目的操作数
wordList WORD 5678h,1234h
mov eax, DWORD PRT wordList; EAX= 12345678H
13. TYPE
var1 BYTE ?
var2 WORD ?
var3 DWORD ?
TYPE var1 ; 1
TYPE var2 ; 2
TYPE var3 ; 4
14, LENGTHOF 数组中的元素的数组
15, sizeof 返回值等于 LENGTHOF 和 TYPE 返回值的 乘积
intArray WORD 32 DUP(0)
mov eax,SIZEOF intArray ; EAX = 64
16, 间接寻址
处理数组唯一可行的方法是用寄存器作为指针并操作寄存器的值,这称为间接寻址
var1 BYTE 10H
mov esi,OFFSET var1
mov al, [esi] ;AL = 10h
inc [esi] ; 错误 编译器不知道ESI是指向一个字节,一个字
inc BYTE PTR [esi]
17,
arrayW WORD 1000H,2000H,3000H
mov esi, OFFSET arrayW
mov ax, [esi] ;AX = 1000h
add esi,2 ; 因为是WORD类型,所以要加2 才能指向下一个元素
mov ax,[esi] ;AX = 2000h
add esi,2
mov ax, [esi] ;AX = 3000h
18 变址操作数
把常量和寄存器相加得到一个有效地址
arrayB BYTE 10h,20h,30h
mov esi, 0
mov al, [arrayB + esi] ; AL = 10h
arrayB WORD 1000h,2000h,3000h
mov esi, OFFSET arrayW
mov ax,[esi] ;AX = 1000h
mov ax,[esi+2] ;AX = 200H
19. TYPEDEF
创建了一种新的数据类型--指向字节的指针PBYTE
PBYTE TYPEDEF PRT BYTE
20 jmp
21 LOOP
mov ax,0
mov ecx,5
L1:
inc ax
loop L1
循环结束时 AX =5, ECX = 0;
22 数组求和
intarry WORD 100H,200H,300H,400H
mov edi,OFFSET intarry ; 首地址
mov ecx,LENGTHOF intarray ; 循环计数器 设置 循环次数
mov ax,0 ; 累加器清零
L1:
add ax,[edi] ;取一个数组值,加上
add edi, TYPE intarray ;指向下一个整数
loop L1
23 在JAVA中,如果向ArrayList添加元素时超过了容量,运行系统会重新分配一块新的内存,并把原来的数据复制到新地址,同事删除原来的数据