汇编-间接寻址(处理数组)

直接寻址很少用于数组处理,因为用常数偏移量来寻址多个数组元素时,直接寻址并不实用。取而代之的是使用寄存器作为指针(称为间接寻址(indirect addressing) ) 并控制该寄存器的值。如果一个操作数使用的是间接寻址, 就称之为间接操作数(indie ct operand) 。

间接操作数

保护模式下任何一个32位通用寄存器(EAX、EBX、ECX、EDX、ESI、EDI、EBP及ESP) 用中括号括起来就成为间接操作数。寄存器中包含的是数据的地址

复制代码
.386  
.model flat,stdcall 
option casemap:none

.data   
byteVal BYTE 10h


ExitProcess PROTO,dwExitCode:DWORD      

.code  
main PROC   
	
	mov esi, OFFSET byteVal 
	mov al, [esi]            ;AL=10h,[esi]表示esi地址中的数据


INVOKE ExitProcess,0  
main ENDP   
END main  

如果目的操作数使用间接寻址,则新值将存入由寄存器指向的内存位置。

复制代码
.386  
.model flat,stdcall 
option casemap:none

.data   
byteVal BYTE 10h

ExitProcess PROTO,dwExitCode:DWORD      

.code  
main PROC   
	
	mov bl,88h
	mov esi , OFFSET byteVal
	mov [esi],bl                ;把bl中的值存入esi表示的地址中
	mov al,[esi]            ;al=88h


INVOKE ExitProcess,0  
main ENDP   
END main  

PTR与间接操作数一起使用

PTR与间接操作数一起使用一个操作数的大小可能无法从指令的上下文直接看出来。

下面的指令会导致汇编器产生"operand must have size"(操作数必须有大小) 的报错消息:

inc [esi]

汇编器不知道ESI指向的是字节、字、双字, 或其他数据大小。

PTR操作符则可以确定操作数的大小,如下例所示:

复制代码
.386  
.model flat,stdcall 
option casemap:none

.data   

val BYTE 12h 

ExitProcess PROTO,dwExitCode:DWORD      

.code  
main PROC   
	
	mov esi,OFFSET val
	inc BYTE PTR [esi]   ;指明BYTE大小
	mov eax,[esi]        ;EAX = 00000013


INVOKE ExitProcess,0  
main ENDP   
END main  
相关推荐
aq55356009 小时前
三大编程语言深度对比:C# vs 易语言 vs 汇编
开发语言·汇编·c#
aq553560012 小时前
编程语言对比:从汇编到PHP的四大层级解析
开发语言·汇编·php
独小乐2 天前
012.整体框架适配SDRAM|千篇笔记实现嵌入式全栈/裸机篇
c语言·汇编·笔记·单片机·嵌入式硬件·arm·gnu
C++ 老炮儿的技术栈3 天前
GCC编译时无法向/tmp 目录写入临时汇编文件,因为设备空间不足,解决
linux·运维·开发语言·汇编·c++·git·qt
cch89183 天前
Java vs 汇编:高级与低级的终极对决
java·开发语言·汇编
2301_789015623 天前
C++:智能指针
c语言·开发语言·汇编·c++·智能指针
独小乐5 天前
007.GNU C内联汇编杂谈|千篇笔记实现嵌入式全栈/裸机篇
linux·c语言·汇编·单片机·嵌入式硬件·arm·gnu
Lzh编程小栈8 天前
数据结构与算法之队列深度解析:循环队列+C 语言硬核实现 + 面试考点全梳理
c语言·开发语言·汇编·数据结构·后端·算法·面试
cch89189 天前
汇编与C语言:底层对话VS高效指挥
c语言·开发语言·汇编
jwn9999 天前
PHP vs 汇编:编程语言的两极对决
开发语言·汇编·php