热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

为什么寄存器(或寄存器的数字表示)不存在于机器指令中

如何解决《为什么寄存器(或寄存器的数字表示)不存在于机器指令中》经验,为你挑选了2个好方法。

我正在研究x86汇编语言,遵循Kip Irvine的书"用于x86处理器的第7版Edi的汇编语言".

在第4章中,作者谈到了机器指令

在此输入图像描述

我的问题是,为什么机器指令中没有al(或表示al)A0 00010400?如果al没有,机器怎么知道我们想要将地址的值移动00010400al

============ 编辑1 ===============

我试过mov bl var1并生成了一个机器代码bl

.386
.MODEL FLAT, STDCALL
.STACK 4096
ExitProcess PROTO, dwExitCode: DWORD

.DATA
var1 BYTE 10h

.CODE 
    main PROC 
    MOV BL, var1 

invoke ExitProcess, 0
main ENDP
END main

在此输入图像描述



1> Johan - rein..:

作为一般规则,寄存器值存在于机器指令.
然而,x86指令集中存在许多遗留的"包袱".
引入8086时,指令的长度会影响执行时间:更短的指令运行得更快.

A寄存器(AX/AL)被称为"累加器"并且使用是在CPU中最通用寄存器.它具有特殊的短版本指令(以前)运行得更快(在原始的8086/8088上).在x86的后续迭代中,其他寄存器被升级为更通用的.现在你几乎可以使用任何寄存器用于所有目的.

您可以在x86操作码地图上清楚地看到这一点,请参阅:http://sparksandflames.com/files/x86InstructionChart.html

请注意,mov al,[absolute address]有2个编码执行相同的操作:
A0和8A 05

0:  a0 00 00 00 00          mov    al,BYTE PTR ds:0x0
5:  8a 05 00 00 00 00       mov    al,BYTE PTR ds:0x0 

回想起来,这很浪费.但是当时使用累加器寄存器更快地制作指令似乎是个好主意.由于向后兼容,这些错误现在无法纠正.
有可能在新的X64指令集中消除这种重复,但AMD不想做太多改动,所以我们永远坚持这些历史文物.



2> Cody Gray..:

我的问题是,为什么机器指令中没有al(或表示al)A0 00010400

因为MOV指令(0xA0)的特殊编码始终AL寄存器作为其目标操作数.其余的代码字节专用于指定源操作数,在本例中是源操作数0x00010400- var1.DATA部分的地址.

你可以在这张表中看到.您还可以看到有其他特殊编码的指令,像0xA1一个MOVAX/ EAX作为其目的地操作数,0xA2对于一个版本MOV,其操作数反转(例如,mov var1, al).

这些替代编码存在的原因是在生成的机器代码中保存字节.正如Hans Passant评论的那样,在20世纪70年代中期到x86处理器构思和设计时,这种事情很重要.当时内存非常昂贵,总线速度要慢得多,因此节省空间非常重要 - 即使代价是使处理器的指令解码器更加复杂.鉴于8088上的非常小的(4字节)提取队列,使用这些特殊的单字节指令编码可以显着提高特定代码序列的速度.然而,现在,这个设计在40年后仍在使用,这是英特尔继续遭受的x86平台的一些传统包袱.现代x86芯片必须将不成比例的大部分硅专用于复杂的指令解码器,即使内存非常便宜,因为这些类型的优化并没有真正帮助任何人.

当其中一个操作数是累加器寄存器时,这些特殊编码不仅可用,而且这是特殊编码的最常见情况.

但是,通常情况下,指令使用操作码字节进行编码,然后是每个操作数的字节.这就是你所看到的mov bl, var1.操作码mov reg8, r/m80x8A.接下来0x1DDL寄存器指定为目标操作数.这里有一个方便的操作码表,或者您可以在英特尔的IA-32架构手册中找到每个单独指令的信息.这个网站非常有用,提供"备忘单"作为说明.你可以在Stack Overflow上的x86标签wiki中找到更多这样的链接.


推荐阅读
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • PHPMailer邮件类邮件发送功能的使用教学及注意事项
    本文介绍了使用国外开源码PHPMailer邮件类实现邮件发送功能的简单教学,同时提供了一些注意事项。文章涵盖了字符集设置、发送HTML格式邮件、群发邮件以及避免类的重定义等方面的内容。此外,还提供了一些与PHP相关的资源和服务,如传奇手游游戏源码下载、vscode字体调整、数据恢复、Ubuntu实验环境搭建、北京爬虫市场、进阶PHP和SEO人员需注意的内容。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
author-avatar
拍友2602924913
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有