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

【提问】汇编语言中32位操作尺寸的问题?

[复制链接]

1

主题

1

回帖

43

积分

至尊会员

积分
43

至尊会员

发表于 2024-1-23 00:00:03 | 显示全部楼层 |阅读模式
老师,您的x86汇编语言第二版书中,第13章中写到:16位操作尺寸意味着指令的操作数长度是8位或者16位的,32位操作尺寸意味着指令的操作数长度是8位或者32位的。   请问老师,为什么32位操作尺寸,指令的操作数长度没有16位的?   
谢谢老师回复!!!

344

主题

255

回帖

2666

积分

管理员

积分
2666
发表于 2024-1-23 09:01:52 | 显示全部楼层
简单来说就是它们互斥。

INTEL 8086~80286只有8位和16位寄存器,它的机器指令只能操作8位或者16位数据,访问内存时,只能使用16位段内偏移量(有效地址)。后来称之为16位指令。

1985年的80386是INTEL的第一款32位处理器,有保护模式,支持平坦内存模型,所以,它需要添加能够操作32位数据的机器指令,也需要添加能够使用32位有效地址的机器指令。后来称之为32位指令。

INTEL公司应该也想在同一相框架下添加32位指令。即,将16位指令和32位指令混合在一起编码。但面临的问题是指令众多,指令集急剧膨胀,指令长度会大大增加,效率降低。

因此,如果能按照不同的工作模式,让32位指令和16位指令共用机器码,是不错的编码方案。比如
89  C8
当处理器工作在16位模式下,即,默认操作尺寸是16位的,它将该机器指令看成是
mov ax, cx

相反地,如果处理器工作在32位模式,即,默认操作尺寸是32位的,它把该机器指令看成是
mov eax, ecx

但是,如果当前默认的操作尺寸是16位的,而我们又想执行32位的
mov eax, ecx
或者,如果当前默认的操作尺寸是32位的,而我们又想执行16位的
mov ax, cx
该怎么办呢?很简单,只需要添加反转操作数尺寸的前缀0x66即可,就象这样:
66 89 C8
如此一来,如果当前默认的操作尺寸是16位的,即,CS描述符高速缓存器中的D位是0,则机器指令
89 C8
被处理器当成是16位操作尺寸的汇编指令
mov ax, cx
来执行,而机器指令
66 89 C8
被处理器当成是32位操作尺寸的汇编指令
mov eax, ecx
来执行。
相反地,如果当前默认的操作尺寸是32位的,即,CS描述符高速缓存器中的D位是1,则机器指令
89 C8
被处理器当成是32位操作尺寸的汇编指令
mov eax, ecx
来执行,而机器指令
66 89 C8
被处理器当成是16位操作尺寸的汇编指令
mov ax, cx
来执行。

1

主题

1

回帖

43

积分

至尊会员

积分
43

至尊会员

 楼主| 发表于 2024-1-23 13:55:05 | 显示全部楼层
站长 发表于 2024-1-23 09:01
简单来说就是它们互斥。

INTEL 8086~80286只有8位和16位寄存器,它的机器指令只能操作8位或者16位数据,访 ...

感谢老师详细的回复!!!!辛苦了~~~~~~~

0

主题

1

回帖

72

积分

注册会员

积分
72
发表于 2024-2-3 15:17:11 | 显示全部楼层
学习到了,感谢感谢
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-7-27 12:02 , Processed in 0.250552 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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