N.E. 和有什么区别?我在英特尔手册中?

如何解决N.E. 和有什么区别?我在英特尔手册中?

Intel's manual for Intel 64 and IA-32 instruction set部分3.1.1.5中,它在指令汇总表中引入了64/32位模式列。

对于 64 位模式支持,它说:

  • I - 不支持
  • 东北- 表示指令语法在 64 位模式下不可编码(它可能代表其他模式下有效指令序列的一部分

一条指令在 64 位模式下不可编码和一条指令在 64 位模式下不支持有什么区别?

解决方法

目前尚不完全清楚英特尔正在做出什么区别,或者做出这种区别为何有用1。看起来 Invalid 仅用于将#UD(非法指令错误)的操作码,这就是他们使用 N.E.即使在没有其他方法来编码具有该操作数大小的指令的情况下。

东北...它可能代表其他模式

中有效指令序列的一部分

这是有道理的,如果他们说“在这个模式下”,我认为匹配他们的文档。例如0x1Fnot a valid opcode or prefix in 64-bit mode,但在其他模式下表示 pop ds

脚注 1:当然,没有未来证明#UD 出现故障的保证 - 未来 CPU 上的未来 ISA 扩展可以将未使用的操作码重新用于 64-位模式,有效地将 Invalid 变为 NE (面向未来的#UD 方法是the 0F 0B opcode,documented as ud2


Invalid 的一个例子是 64 位模式下的 aam(立即除法):在该模式下根本没有指令的编码,并且操作码未使用。

NE 的一个例子是 inc r32 short form 0x40+rd,64 位模式将其(连同 0x48+rd dec)重新用作 REX 前缀。 inc eax 也是可编码的,但不能使用 那个 操作码。

同样,inc r/m64 被列为 N.E.对于兼容/传统模式;即它仅在长模式下可用,通过 REX 前缀。

pop 在一张表中包含这两种类型的示例:

  • 不再有任何方法可以使用任何操作数大小来执行 pop ds(或 ES/SS),并且这些操作码被释放以供将来使用,因此它在 64 位模式下是“无效的”。 (pop cs 从未有效,除了一些未记录的/早期 8086;只有像 retf 这样的东西将 CS:[ER]IP 设置在一起,而不仅仅是 CS。)
  • pop fs 和 GS 可以使用 16 位或 64 位操作数大小完成,但不能使用 32 位,因此
    "0F A1 POP FS ... 将栈顶弹出到 FS;将栈指针增加 32 位"
    表的一行有 N.E.对于 64 位模式,对 compat/legacy 有效。而 ... by 64 bits 行是相反的,对 64 有效,对 32 无效。(有趣的是,当 RSP 以字节为单位时,他们写的是“by 64 bits”而不是“by 8”,不是位。)

pop r32pop r/m32 都列为 N.E.对于 64 位模式,并非无效,尽管在该模式下无法对 pop eaxpop dword [rdi] 进行编码。 所以看起来 Invalid 是关于操作码,而不是指令。

(对于默认为 64 的操作码,即使 REX.W=0 也不会将操作数大小覆盖为 32 位,但是 66 操作数大小前缀确实像往常一样工作以进行推送/弹出16 位。尽管“描述”文本说操作数大小可能被 REX.W 覆盖 - 这似乎是在谈论一般指令,正如当前代码段的 D 标志所暗示的那样。)

也许是因为 64 位模式仍然可以使用相同的操作码弹出其他 2 种大小(64 位或 16 位)?或者其他 2 种尺寸的 r/m 带流行音乐?例如pop axpop word [rdi] 在 64 位模式下有效,当然还有 pop rax

这与他们列出 pop ds 的方式一致。


我想知道 movsxd r64,r/m32 是 Invalid 还是 N.E.在 16/32 位模式下,因为相同的操作码在 64 位模式之外具有不同的含义(ARPL r,r/m16 - http://ref.x86asm.net/coder32.html#x63)。

但它只是 N.E.对于 32 位模式,movsxd r32,r/m32 对于这两种模式都被列为“有效”! 这一定是一个错误,因为它显然是错误的。兼容/传统模式下的操作码 63ARPL。 (被列为 N.E. (64) / Valid (32),其操作部分提到 movsxd 用于 64 位模式。)所以 N.E.将匹配他们将其用于具有其他含义但没有错的事物的模式。

(现实世界的汇编器,如 NASM 和 YASM,即使在 64 位模式下也拒绝 movsxd eax,ecx;他们想​​要一个 64 位目标,拒绝让您将其用作更糟的 mov eax,ecx,即使那样 在机器代码中是可能的,但英特尔的手册不鼓励这样做。不幸的是,movsxd 需要一个 REX 前缀来满足其唯一目的:将 32 符号扩展到 64。不是堆栈或分支操作 I猜测 AMD 决定将操作数大小默认为 64 位更加一致。)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)> insert overwrite table dwd_trade_cart_add_inc > select data.id, > data.user_id, > data.course_id, > date_format(
错误1 hive (edu)> insert into huanhuan values(1,'haoge'); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive> show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 <configuration> <property> <name>yarn.nodemanager.res