热门标签 | HotTags
当前位置:  开发笔记 > 开发工具 > 正文

Whymovax,[[num]+val]isn'tthesameasbreakingittoinstructions

如何解决《Whymovax,[[num]+val]isn'tthesameasbreakingittoinstructions》经验,为你挑选了2个好方法。

I need to use a pointer to an array and put the third value in ax. My solution:

mov bx, [chrs_ptr]
add bx, 2
mov ax,[bx]

But I couldn't figure out why mov ax, [[chrs_ptr] + 2] gives me the pointer value.



1> Ped7g..:

因为汇编程序与大多数其他编程语言不同。

大多数PL旨在将其语法作为组成部分进行通用化和通用化,以构成超出特定单个功能的普通语法的表达方式。

汇编器是特定处理器的机器代码的“人类可读”助记符。即,特定汇编程序中可用的指令不是由汇编程序创建者设计的(大多数情况下),而是由设计CPU本身的硬件工程师定义的。因此,汇编程序的指令取决于目标处理器,就像从源代码形式到实际CPU指令的1:1映射一样(除了少数例外,某些汇编程序实际上确实支持少量伪指令,但通常为1:1 )。

因此,模拟8086 CPU的emu8086(以及该家族中随后的少数几个80286甚至80386?我不确定emu8086支持什么,因为我不使用它)在那些处理器中仅设计了Intel指令。

例如,MOV r16,r/m16在第16行实模式中有一条mov ax,[bx]指令,您正在使用,但是没有类似的指令MOV r16,memory-by-indirection-from-other-memory with +2 offset,因此在汇编中进行编程时,您应该了解目标指令集,并使用可用的指令编写解决方案。

您可能会质疑为什么某些指令只执行“那个”,而不执行“这个”,您似乎认为这很明显,但是大多数情况下,ISA(指令集体系结构)往往在两者之间做出很好的折衷。足够编写实用的代码,并且可以在电路中进行实际设计,并在每个单个机器周期内具有合理的功耗和时序特征,并且对于早期的CPU而言,可以手工进行实际设计并验证其正确性。

您的建议mov ax,[[chrs_ptr]+2]在一条指令执行过程中需要两次读取内存,而读取内存绝非易事(通常会使CPU停顿多个机器周期,直到内存芯片准备好从特定单元传递值为止),因此您将立即提高CPU电路设计的复杂性。喜欢很多

也许您可能会质疑为什么汇编程序不会将其分解为处理器的三个本机指令。

但是通常在需要汇编程序时,实际上实际上需要将汇编程序源指令的1:1映射到目标CPU的本机代码指令。因为如果不需要,那么为什么还要使用汇编语言,有很多高级语言,它们可以使您对计算机进行足够的低级控制,但是可以增强对诸如C或C ++之类的所有内容的微管理。 。因此,很少有动力去丰富汇编程序的“语言”本身,通常当您看到这样的努力时,它最终会变成另一种编程语言,当您真的需要编写时,它太脏了以至于无法代替实际的汇编程序使用手动处理这几条CPU指令,并将其调低至每个字节。


区别在于,解码“ cmpsb”不需要解码两个ModRM字节:ModRM解码可能未在内部进行微编码,因此支持更复杂的寻址模式*会*增加复杂性。这就是字符串指令隐式为DS:SI和/的原因之一。或ES:DI,无显式地址模式可解码。8086大概是用微码实现的,这使得它相当便宜。IMO的内存间接寻址模式的最大代价是代码大小以及解码复杂性。在加法器模式下,一个ModRM字节已经非常有限。也许您会放弃`disp8`以获得“模式”。

2> Peter Cordes..:

无法在8086机器代码中对内存间接寻址模式进行编码。16位寻址模式的ModRM字节只能编码很少的可能性:的任何子集[bx|bp + si|di + disp0/8/16]

基本上是您无法删除的原因mov word ptr [si], [di](为什么不允许在内存之间移动?)

asm源代码的局限性来自机器代码,而高级语言中的限制在于,您可以仅发明必要时可编译为更多指令的语法。

我认为您是在说emu8086的汇编程序确实接受mov ax,[[chrs_ptr]+2]而没有错误。 这是因为EMU8086的内置汇编器很糟糕,并且并不总是报告损坏代码的语法错误。

大概它的组装方式与相同mov ax, [chrs_ptr+2],忽略了多余的方括号。实际上,由于它使用MASM / TASM语法,因此它也与mov ax, chrs_ptr+2

不幸的是,甚至MASM / TASM也没有警告mov ax, [[chrs_ptr] + 2]。正如罗斯·里奇(Ross Ridge)指出的那样,除非方括号内有寄存器名称,否则方括号并不表示内存引用。否则将忽略括号。请参阅MASM32中令人困惑的括号


IIRC,emu8086的汇编程序还有其他缺点,例如add [bx], 1假定操作数大小为“字”或字节,但我忘记了这些功能,而不是在不确定的操作数大小上出错。

这基本上是可怕的,如果可能的话,请避免使用它。

否则,请使用将发出警告的另一个汇编程序(如MASM或TASM)检查代码中的语法错误,而不是将不可能的代码组合到执行某些操作的机器代码中。(除非在这种情况下,即使他们也无法禁止这种令人困惑的语法。)

有些人出于其他原因喜欢MASM样式的语法,但我不建议这样做。NASM很不错,尤其是如果您真的不关心简单的引导加载程序和.com程序之外的过时16位分段开发时。


@ Ped7g。我从没使用过emu8086,只是在SO上阅读了一下。(或者我曾经运行它尝试过一次吗?我忘记了。)无论如何,查看十六进制机器代码和源代码列表仅在您充分了解机器代码以意识到`add [si],1`正在使用错误的操作数大小,并且您忘记了“ word ptr”或“ byte ptr”。如果您知道`mov r / m16,imm8`不存在,那么使用`mov`更容易。当我想验证来源时,我关注的是反汇编,而不是清单。(`objdump`或在调试器中,和/或`objconv`或ndisasm,如果我不相信GNU binutils像Intel模式下的x87`fsubr` AT&T错误)
@ user202729`chrs_ptr`大概是标签,因此无论您是否将其放在方括号中,MASM都将其用作内存引用。语句`mov bx,[chrs_ptr]`与`mov bx,chrs_ptr`相同。/sf/ask/17360801/#25130189
推荐阅读
  • 告别繁琐安装!微软推出Windows软件包管理器winget
    2020年5月20日,在Build 2020全球开发者大会上,微软正式推出了全新的Windows Package Manager(winget),旨在简化Windows应用的安装流程。 ... [详细]
  • 本文详细介绍了如何在本地环境中安装配置Frida及其服务器组件,以及如何通过Frida进行基本的应用程序动态分析,包括获取应用版本和加载的类信息。 ... [详细]
  • 本文介绍了如何通过Git日志查找特定的提交记录,并使用git reset --soft命令撤销指定版本的提交,同时保留工作目录中的更改。最后,文章还说明了如何通过强制推送更新远程仓库。 ... [详细]
  • 使用IntelliJ IDEA高效开发与运行Shell脚本
    本文介绍了如何利用IntelliJ IDEA中的BashSupport插件来增强Shell脚本的开发体验,包括插件的安装、配置以及脚本的运行方法。 ... [详细]
  • 深入解析Nacos服务自动注册机制
    本文将探讨Nacos服务自动注册的具体实现方法,特别是如何通过Spring事件机制完成服务注册。通过对Nacos源码的详细分析,帮助读者理解其背后的原理。 ... [详细]
  • 本文详细记录了在Mac操作系统中安装Hexo时遇到的权限错误,并提供了有效的解决方案。 ... [详细]
  • Redis管理工具的安装与使用指南
    本文详细介绍了两款流行的Redis管理工具——Another Redis Desktop Manager 和 Redis Desktop Manager 的安装步骤及基本使用方法,旨在帮助用户更高效地管理和操作Redis数据库。 ... [详细]
  • 本文将详细介绍如何配置并整合MVP架构、Retrofit网络请求库、Dagger2依赖注入框架以及RxAndroid响应式编程库,构建高效、模块化的Android应用。 ... [详细]
  • Git版本控制基础解析
    本文探讨了Git作为版本控制工具的基本概念及其重要性,不仅限于代码管理,还包括文件的历史记录与版本切换功能。通过对比Git与SVN,进一步阐述了分布式版本控制系统的独特优势。 ... [详细]
  • 本文档涵盖了多个 Python 编程练习题,包括使用 while 和 for 循环处理数字序列、字符串操作以及简单的算法实现等。每道题目都提供了详细的代码示例,旨在帮助初学者加深对 Python 基础知识的理解。 ... [详细]
  • 本文总结了在多人协作开发环境中使用 Git 时常见的问题及其解决方案,包括错误合并分支的处理、使用 SourceTree 查找问题提交、Git 自动生成的提交信息解释、删除远程仓库文件夹而不删除本地文件的方法、合并冲突时的注意事项以及如何将多个提交合并为一个。 ... [详细]
  • 本文介绍了在Visual C++环境中通过编程实现鼠标移动及点击的具体方法,包括获取鼠标当前位置、移动鼠标至指定位置并执行点击等操作。 ... [详细]
  • 探索将Python Spyder与GitHub连接的方法,了解当前的技术状态及未来可能的发展方向。 ... [详细]
  • 本文档提供了在Windows 10操作系统中安装Python 3及Scrapy框架的完整指南,包括必要的依赖库如wheel、lxml、pyOpenSSL、Twisted和pywin32的安装方法。 ... [详细]
  • 本文详细介绍了Java中的org.jooq.tools.json.Yytoken类的应用场景,并提供了多个实际使用的代码示例,帮助开发者更好地理解和运用这一工具。 ... [详细]
author-avatar
超级娱乐测试_499
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有