寻址方式小结

寻址方式小结最近看了下王爽著的 里面总结了 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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)

    SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)使用SSM(Spring、SpringMVC和Mybatis)已经有三个多月了,项目在技术上已经没有什么难点了,基于现有的技术就可以实现想要的功能,当然肯定有很多可以改进的地方。之前没有记录SSM整合的过程,这次刚刚好基于自己的一个小项目重新搭建了一次,而且比项目搭建的要更好一些。以前解决问题的过程和方法并没有及时记录,以后在自己的小项目中遇到我再整理分享一下。这次,先说说三大框架整合过程。个人认

    2022年5月4日
    46
  • 《Android平台开发之旅》学习笔记

    《Android平台开发之旅》学习笔记第三章:Android应用程序组件3.2Android应用程序组件Activity活动–形象大使Service服务–老黄牛BroadcastReceiver广播接收器–倾听者ContentProvider内容提供者3.3组件应用机制3.1.1组件之间的交互机制Intent(意向)组件实现组件之间的交互,马上要执行的动作3..1.2未决意意向Pending…

    2022年9月28日
    4
  • linux查看当前用户信息及其用户切换[通俗易懂]

    linux查看当前用户信息及其用户切换[通俗易懂]linux查看当前用户信息及其用户切换一、查看用户信息作为系统管理员,你可能经常会(在某个时候)需要查看系统中有哪些用户正在活动。有些时候,你甚至需要知道他(她)们正在做什么。本文为我们总结了4种查看系统用户信息(通过编号(ID))的方法。使用w命令查看登录用户正在使用的进程信息w命令用于显示已经登录系统的用户的名称,以及他们正在做的事。该命令所使用的信息来源于/var/run/utmp…

    2022年5月1日
    111
  • ftp上传下载工具,6款最值得推荐的Windows端ftp上传下载工具

    ftp上传下载工具,6款最值得推荐的Windows端ftp上传下载工具ftp上传下载工具是一种文件传输下载方式,它是TCP/IP协议栈的一部分;其中FTP又由两部分组成,一部分是FTP的服务器,另一部分是FTP的客户端!它能够高效安全地进行文件传输下载操作!可以使用服务器管理工具来作为FTP的客户端,进行FTP的操作,实现FTP的下载安装等!第一款:iis7服务器管理软件iis7远程桌面管理软件,是一款绿色小巧,功能实用的FTP工具软件,其界面简洁,操作方便,它支持FTP批量上传下载,它可以同时连接多台ftp服务器进行文件传输工作,还可以在线解压缩文件,支持文件查找,在线

    2022年5月27日
    40
  • Mac配置Jdk 安装及系统环境配置[通俗易懂]

    Mac配置Jdk 安装及系统环境配置

    2022年4月3日
    37
  • Python Faker的使用,你了解多少呢?

    Python Faker的使用,你了解多少呢?

    2021年5月24日
    161

发表回复

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

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