寻址方式小结

寻址方式小结最近看了下王爽著的 里面总结了 8086CPU 编程的寻址方式 nbsp nbsp 1 idata 用医保常量来表示地址 可用于直接定位一个内存单元 nbsp nbsp 2 bx 用一个变量来表示内存地址 可用于间接定位一个内存单元 nbsp nbsp 3 bx idata 用一个变量和常量表示地址 可在一个起始地址的基础上用变量间接定位一个内存单元 nbsp nbsp 4 bx si 用两个变量表示地址 nbsp nbsp 5

   最近看了下王爽著的<<汇编语言(第三版)>>,里面总结了8086 CPU编程的寻址方式。

   (1)[idata]用医保常量来表示地址,可用于直接定位一个内存单元;

   (2)[bx]用一个变量来表示内存地址,可用于间接定位一个内存单元;

   (3)[bx+idata]用一个变量和常量表示地址,可在一个起始地址的基础上用变量间接定位一个内存单元;

   (4)[bx+si]用两个变量表示地址;

   (5)[bx+si+idata]用两个变量和一个常量表示地址;

    8086CPU中只有bx,bp,si,di这4个寄存器可以寻址。以上1-5点的寻址方式,在汇编程序中可以方便快捷的访问到一维数组,二维数组,结构体数组等。

    事实上,32位和64位汇编的寻址方式和寄存器使用更加灵活。但是大体思路和用法和8086汇编仍然是一致的。

    比如如下C++代码片段:

 int array1[10] = {1,2,3,4,5,6,7,8,9,10}; int array2[3][3] = { 
  {8,8,8},{8,8,8},{8,8,8}}; int array3[4][4][4] = {9}; long array4[8] = {123,0,8}; int count = 0; while(1) { test_fun1(array1[count],array2[1][count],array3[1][count][2]); test_fun1(array4[0],array4[1],array4[2]); count++; if(count>3) { break; } }

   Debug模式下的汇编代码片段如下:

 test_fun1(array1[count],array2[1][count],array3[1][count][2]); 01303AB4 mov eax,dword ptr [count] 01303ABA shl eax,4 01303ABD mov ecx,dword ptr [ebp+eax-118h] 01303AC4 push ecx 01303AC5 mov edx,dword ptr [count] 01303ACB mov eax,dword ptr [ebp+edx*4-4Ch] 01303ACF push eax 01303AD0 mov ecx,dword ptr [count] 01303AD6 mov edx,dword ptr array1[ecx*4] 01303ADA push edx 01303ADB call test_fun1 (13011FEh) 01303AE0 add esp,0Ch test_fun1(array4[0],array4[1],array4[2]); 01303AE3 mov eax,dword ptr [ebp-180h] 01303AE9 push eax 01303AEA mov ecx,dword ptr [ebp-184h] 01303AF0 push ecx 01303AF1 mov edx,dword ptr [array4] 01303AF7 push edx 01303AF8 call test_fun1 (13011FEh) 

       如上,很明显可以看到多种寻址方式。而8086中的bx寄存器,在这里更多的是使用了ebp基址寄存器(函数栈帧)。01303ABD  mov         ecx,dword ptr [ebp+eax-118h]  这里idata为-118h,为118h,是因为array3是局部变量,他们都是存放在函数栈帧上,跟ebp有关联。

       对应8086的si,这里使用的可以是eax或者edx等。寄存器使用的不一样,寻址方式的本质其实是一样的。



版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233304.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Charles抓包工具简单教程

    Charles抓包工具简单教程为什么使用charles-windows在实际开发、测试中需要代理截取app的网络请求报文来快速定位问题,https双向认证的APP越来越多,fiddler在这方面并不好用。由于windows系统较多,编写此博客作为windows版的使用指南,其中包含了一些简易的使用,安装hhtps证书抓包,常用的设置,以及弱网测试,下列都会详细讲解,内容为本人的测试经验,不足之处还望补充。所需材料·…

    2022年6月12日
    48
  • 虚拟现实开发完整教程视频_新手入门虚拟现实技术

    虚拟现实开发完整教程视频_新手入门虚拟现实技术基于unity的HTCvive开发综合教程:http://www.52vr.com/hardware/vive/

    2022年9月13日
    0
  • PhpStorm 2021 激活码【永久激活】

    (PhpStorm 2021 激活码)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlML…

    2022年3月21日
    89
  • 夜深人静学算法_描写夜深人静的成语

    夜深人静学算法_描写夜深人静的成语基于字符串前缀匹配的高效字符串匹配算法—字典树

    2022年9月7日
    0
  • 矩阵分析:向量范数,矩阵范数,范数应用[通俗易懂]

    矩阵分析:向量范数,矩阵范数,范数应用[通俗易懂]1,向量范数1.1,向量范数的定义和例子设是复数域上的维向量空间,称函数为向量范数,是指对所有,有下列性质:(1)非负性:,并且当且仅当。(2)齐次性:对任何,。(3)三角不等式:若对任意,有:(1)(2)(3)证明(3):根据三角不等式,有:两式分别相减可得:设,则下列实值函数都是上的向量范数:(1)2范数:(2)1范数:(3)范数:(4)p范数:,当时,分别得到向量1范数和2范数,并且可以证明…

    2022年9月19日
    1
  • CentOS 7修改网络接口名称

    CentOS 7修改网络接口名称

    2021年6月12日
    150

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号