汇编语言基础教程-寻址方式

1立即寻址

在指令中使用的操作数为常数

如:

mov eax,190;与mov eax,00BEH相同,低字节在前s

mov eax,0FFFFFFFFH;与 mov eax,-1相同

eax可以存放一个双字

 

2寄存器寻址

操作数已经在CPU的寄存器中

如:

mov EAX,EBX

 

3直接寻址

操作数为一个已经定义好的变量

如:

mov eax,dvar;dvar为一个双字变量

mov dvar,eax

在翻译成及其指令后,以上指令就变成了类似以下形式

mov eax,[00404011];地址外面加一个方括号,表示取这个地址的内容

 

4寄存器间接寻址

操作数的地址放在寄存器中

如:

mov ESI,00404011H

mov EAX,[ESI]

32位CPU中EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP能用作间接寻址

 

5寄存器相对寻址

如:

mov ESI,00404011H

mov EAX,[ESI+4]

 

6基址变址寻址

如:

mov ESI,00404011H

mov EBX,4

mov EAX,[ESI+EBX]

 

7基址变址相对寻址

如:

mov ESI,00404011H

mov EBX,4

mov EAX,[ESI+EBX+4]

 

8基址变址比例相对寻址

如:

mov ESI,00404011H

mov EBX,4

mov EAX,[ESI+EBX*2+4]

 

9*段超越

内存操作数的地址由两个部分指定:段和有效地址。

寻址方式中确定操作数的有效地址后,还要依靠段寄存器一起来确定操作数的内存地址

默认情况下内存操作指令在DS段中

如果使用了ESP和EBP来寻址,那么使用的是SS段寄存器

如:

mov eax,[ebp+8];内存操作数在SS段中

使用段超越前缀可以改变寻址方式中默认使用的段寄存器

如:

mov eax,cs:[ESP-4]

windows 32编程环境下CS,DS,ES,SS在内存中指向同一个段,其大小为4G

所以一般用不到段超越的操作

时间: 2024-10-30 22:39:58

汇编语言基础教程-寻址方式的相关文章

汇编语言基础教程-加法指令

1.add  dst,src dst不能是立即数 dst和src不能同时采用内存操作数 可用于有符号和无符号的加法运算 CF=1说明无符号数加法运算有溢出,最高位有进位 OF=1说明有符号数加法运算有溢出,两个正数相加结果却是负数,或两个负数相加结果却是正数   2.inc dst 目的操作数加1,不设置CF标志位 速度快   3.adc dst,src 两个操作数做加法,在加上CF的值 两个加数都为64位的时候会用到此指令 要先把两个操作数拆分成4个32位数 然后可以这样做 mov eax,l

汇编语言基础教程-指令:传送,交换,取地址

1.mov 如: mov eax,20   ;把立即数20送入通用寄存器 mov edi,esi    ;寄存器之间传递数据 mov dVar,20    ;把20送入内存操作数(变量) mov WORD PTR [EBX],20   ;传送字到EBX指向的地址 mov [ebx],DWORD PTR [ESI]  ;错误指令,两个操作数不能都是内存操作数,可改为两条指令完成这个需求 mov ds,0023h   ;错误指令,立即数不能直接送段寄存器 mov ds,ss     ;错误指令,两个

汇编语言基础教程-减法指令

1:sub dst,src cf=1表示无符号数减法发生溢出 OF=1表示有符号减法发生溢出 (一个正数减去一个负数却得到一个负数,一个负数减去一个正数却得到一个正数)   2:DEC DST 目的操作数减1,不置标志位,速度快   3:SBB DST,SRC 两个操作数相减再减去CF标志位 SBB多用于多位数的减法 两个64位数相减要先把两个64位数拆成4个32位数 再进行如下操作 mov eax,low1 mov edx,high1 sub eax,low2 sbb edx,high2 此时

汇编语言基础教程-寄存器

32位CPU一般包括如下寄存器   1.通用寄存器 8个32位寄存器 EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP 8个16位寄存器 AX,BX,CX,DX,SI,DI,BP,SP 8个8位寄存器 AH,AL,BH,BL,CH,CL,DH,DL   2.段寄存器 6个16位段寄存器 SS,CS,DS,ES,FS,GS 注意只能对CS寄存器做读取操作

汇编语言基础教程-除法指令

1:div src src为8位时:ax/src = al余数放在AH中 SRC位16位时:DX:AX/SRC = AX,余数放在DX中 SRC为32位时:EDX:EAX/SRC = EAX,余数放在EDX中   2:IDIV 带符号的除法 A/B的表示如下: mov ax,a cwd;把ax扩展为dx:ax idiv b

汇编语言超浓缩教程_其它相关

所以我个人看法学汇编,不一定要写程序,写程序确实不是汇编的强项,大家不妨玩玩DEBUG,有时CRACK出一个小软件比完成一个程序更有成就感(就像学电脑先玩游戏一样).某些高深的指令事实上只对有经验的汇编程序员有用,对我们而言,太过高深了.为了使学习汇编语言有个好的开始,你必须要先排除那些华丽复杂的命令,将注意力集中在最重要的几个指令上(CMP LOOP MOV JNZ--).但是想在啰里吧嗦的教科书中完成上述目标,谈何容易,所以本人整理了这篇超浓缩(用WINZIP.WINRAR-依次压迫,嘿嘿!

xcode-学习objective-c 基础教程遇到问题 例题03.06 word-length-3 编译出错

问题描述 学习objective-c 基础教程遇到问题 例题03.06 word-length-3 编译出错 #import int main(int argc, const char * argv[]) { FILE *wordFile = fopen ("/tmp/words.txt", "r"); char word[100]; while (fgets(*word,99,wordFile)) \这一行编译出现"Thread 1:EXC_BAD_AC

类别-Objective-C基础教程中一句话读不懂,求解!

问题描述 Objective-C基础教程中一句话读不懂,求解! 在第12章类别前边第一段中有:"当使用类方法stringWithFormatFor生成一个新类时,你新建的NSString类的子类无法返回." 解决方案 NSString实际上只是一个类簇的前台表示,因而无法为这样的类创建子类.在其他情况下,你也许可以创建子类但你使用的却是工具包或类库,因为又无法处理新类的对象.例如,当使用类方法stringWithFormatFor生成一个新的字符串时,你新建的NSString类的子类无

Excel2007基础教程:插入行和列

Excel2007基础教程:插入行和列 虽然工作表中的行数和列数是固定的,但如果需要为添加信息腾出空间,则用户仍然可以插入和删除行和列.这些操作并不改变行和列的数量.其实,插入一 个新行就是把其他行向下移,腾出一个新行.如果最后一行为空,将从工作表中删除.插入新的一列,其他列将向右移,如果最后一列为空,将会被删除. 注意:如果最后一行不为空,则用户不能插入一个新行.同样地,如果最后一列包含信息,则Excel 不会让用户插入新的一列.如果想尝试添加一行或一列,将显示如图4.11 所示的对话框. 可