寻址方式小结

寻址方式小结最近看了下王爽著的 里面总结了 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)
上一篇 2025年7月30日 下午8:01
下一篇 2025年7月30日 下午8:22


相关推荐

  • 进程调度算法(全网最细)

    进程调度算法(全网最细)写在前面 我是 程序员宝藏 的宝藏派发员 致力于创作原创干货 我热爱技术 热爱开源与分享 创作的 计算机基础面试问题 系列文章和 计算机基础主干知识 系列文章广受好评 后期会创作更多优质原创系列文章 如果您对计算机基础知识 编程等感兴趣 可以关注我 我们一起成长 本人力荐 如果觉得 CSDN 排版不够美观 欢迎来我的个人原创公 zong 号 程序员宝藏 号如其名 诚不欺你 查看有红色重点标记和排版美观的全系列文章 不细你来找我要红包 参考链接 TCP 三次握手四次挥手好多同学问我要 pdf 版 我干脆

    2026年3月17日
    2
  • 常用程序打包软件

    常用程序打包软件Installshiel nbsp nbsp nbsp 最常用的工具就是 Installshiel Macrovision 软件公司家族成员之一的 InstallShiel 产品 是安装工具领域事实上的标准 InstallShiel 软件是软件安装 配置软件包和升级解决方案领域内公认的标准 nbsp InstallShiel 已经成为安全安装软件的标准解决方案 涉及全球 6 9 万多个开发组织和 5 亿台电脑 主流的 MS

    2026年3月17日
    2
  • Otacle表查询

    Otacle表查询

    2021年12月10日
    61
  • Pandas merge函数「建议收藏」

    Pandas merge函数「建议收藏」[toc]函数原型pd.merge(left,right,how=’inner’,on=None,left_on=None,right_on=None,left_index=False,right_index=False,sort=True,suffixes=(‘_x’,’_y’),copy=True,indicator=False,validate=None)参数left:拼接的左侧DataFrame对象r.

    2022年5月12日
    46
  • 马尔可夫不等式和切比雪夫不等式

    马尔可夫不等式和切比雪夫不等式Markov sInequality 中文叫马尔科夫不等式或马尔可夫不等式 若随机变量 XXX 只取非负值 则 a gt 0 foralla gt 0 a gt 0 有 P X a E X a mathbb P X gea le dfrac mathbb E X a P X a aE X 证明 取 Ya aI X a Y a a mathbb I X gea Ya aI X a 则必有 Ya XY a leXYa X 进而有 E Ya E X mathbb E

    2026年3月17日
    2
  • 1.两数之和_两个数的和怎么算

    1.两数之和_两个数的和怎么算1.两数之和

    2022年4月20日
    66

发表回复

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

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