找回密码
 立即注册
搜索
热搜: 活动 通知
查看: 434|回复: 4

关于默认操作尺寸为32 16时 操作数是8位时的一些小问题

[复制链接]

1

主题

2

回帖

45

积分

至尊会员

积分
45

至尊会员

发表于 2024-5-28 17:02:44 | 显示全部楼层 |阅读模式
《x86汇编语言:从实模式到保护模式》视频课程 第23章中 “x86的指令格式-指令前缀部分”这个视频18分35秒,老师说当操作数是8位时,默认操作尺寸无论是32还是16,机器指令没有变化。视频里给出了三个例子

我感觉很疑惑,8位操作数的操作码部分虽然是单独编码的,但是R/M字段是分为16位寻址和32位寻址的,也会完全一样吗,于是测试了一下



"mov al,dl"的机器指令没有任何变化,但是“mov[bx+di],dh”的机器指令 32位寻址和16位寻址 是有变化的,也需要加上67前缀。

打开官方文档


发现“mov[bx+di],dh”的机器指令和“mov[ecx],dh”的机器指令是相同的,很明显如果没有67反转,那么处理器应该不能正确区分这两条指令。观察文档,总结一下:两个操作数是8位并且都是寄存器时,16位寻址和32位寻址的机器指令才是完全相同的,不需要加66或67前缀?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

350

主题

279

回帖

2816

积分

管理员

积分
2816
发表于 2024-5-28 18:06:30 | 显示全部楼层
不能过于机械地理解。
我只是说“当操作数是8位”,但这个论断不能对抗我们之前对有效地址尺寸的论述。地址是地址,操作数是操作数。即使操作数是8位,但有效地址依然需要反转。

1

主题

2

回帖

45

积分

至尊会员

积分
45

至尊会员

 楼主| 发表于 2024-5-28 18:13:58 | 显示全部楼层
站长 发表于 2024-5-28 18:06
不能过于机械地理解。
我只是说“当操作数是8位”,但这个诊断不能对抗我们之前对有效地址尺寸的论述。地址 ...

有点懂了..谢谢老师回复!

3

主题

11

回帖

69

积分

注册会员

积分
69
发表于 2024-5-30 11:10:43 | 显示全部楼层
本帖最后由 Unis 于 2024-5-30 11:23 编辑

说一下自己的理解,欢迎探讨。

添加0x66前缀,是因为在32位模式下,指令中使用了16位通用寄存器作为操作数,不然你怎么区分mov ax, bx和mov eax, ebx?或者在16位模式下,指令中使用了32位寄存器作为操作数。

添加0x67前缀,是因为在32位模式下,指令中的【寻址表达式】使用了16位通用寄存器,不然你怎么区分mov [ebx+edi], dl和mov [bx+di], dl?这与操作数长度无关,如果指令中同时使用了16位寄存器作为操作数,则还要再添加0x66前缀。换成16位模式,也是一样。

【通用寄存器作为指令操作数】和【通用寄存器用于寻址表达式】不是一个概念。

对于mov al, dl不添加前缀,我想再问楼主一个问题:IA-32架构有“8位模式”么?

1

主题

2

回帖

45

积分

至尊会员

积分
45

至尊会员

 楼主| 发表于 2024-7-5 12:06:51 | 显示全部楼层
Unis 发表于 2024-5-30 11:10
说一下自己的理解,欢迎探讨。

添加0x66前缀,是因为在32位模式下,指令中使用了16位通用寄存器作为操作数 ...

谢谢! 这个问题很好
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|鼠侠网 ( 吉ICP备19001332号 )

GMT+8, 2024-9-8 09:14 , Processed in 0.229715 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表