寻址方式小结

寻址方式小结最近看了下王爽著的 里面总结了 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


相关推荐

  • 【DeepEP】使用Cursor+Mermaid阅读代码(一)类图总览

    【DeepEP】使用Cursor+Mermaid阅读代码(一)类图总览

    2026年3月16日
    1
  • Selenium:Chrome、Edge、Firefox、Opera、Safari常用WebDriver下载安装[通俗易懂]

    Selenium:Chrome、Edge、Firefox、Opera、Safari常用WebDriver下载安装[通俗易懂]简介:Selenium中运行需要先配置WebDriver,各主流浏览器安装配置大同小异。关联攻略:Selenium分布式运行:SeleniumGridPython+Jenkins+Selenium-Grid实现分布式web-ui自动化测试(centos+win10为例)基本操作:1、下载安装目标浏览器。2、查看浏览器版本:设置-帮助/关于浏览器等3、下载driver4、解压driver复制粘贴到配置好的环境变量Python所在目录5、编写代码调试启动注意事项:若找不到对

    2026年1月21日
    5
  • MCP + Cursor:AI代码助手加持,让你的Minecraft Mod开发效率飙升!

    MCP + Cursor:AI代码助手加持,让你的Minecraft Mod开发效率飙升!

    2026年3月16日
    2
  • Django(3)pycharm创建项目[通俗易懂]

    Django(3)pycharm创建项目[通俗易懂]创建项目我们创建django项目有两种方式,命令行方式和使用pycharm工具创建,本文就介绍常用的pycharm工具创建首先点击django,输入项目的名称,选择创建好的虚拟环境,最后点击cre

    2022年7月28日
    4
  • java aba问题_JAVA与ABA问题

    java aba问题_JAVA与ABA问题在 JAVA 并发编程实战 的第 15 4 4 节中看到了一些关于 ABA 问题的描述 有一篇文章摘录了书里的内容 书中有一段内容为 如果在算法中采用自己的方式来管理节点对象的内存 那么可能出现 ABA 问题 在这种情况下 即使链表的头结点仍然只想之前观察到的节点 那么也不足以说明链表的内容没有发生变化 如果通过垃圾回收器来管理链表节点仍然无法避免 ABA 问题 那么还有一个相对简单的解决方法 不是只是更新某个引用

    2026年3月16日
    2
  • 业务架构师如何进阶成长[通俗易懂]

    业务架构师如何进阶成长[通俗易懂]一、前言接触业务架构工作之后,除了单位提供的方法论外,为了做好这项工作,认真学习了软件过程、系统分析与设计、架构设计、设计模式、Java语言等内容,并研读了敏捷开发、领域驱动设计、工作流分析等方面的书籍,为了拓展对新技术的理解,在人工智能和区块链两方面也阅读了一些著作,总体而言,不够系统,都是为了能够更好地理解企业级业务架构的方法论及其向技术端的传导。除了恶补基础知识,更重要的当然是实践,珍惜每一个设计任务,珍惜每一次与业务人员、技术人员的沟通机会…

    2022年10月12日
    6

发表回复

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

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