数据寻址

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 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添加元素时超过了容量,运行系统会重新分配一块新的内存,并把原来的数据复制到新地址,同事删除原来的数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值