为什么8086段寻址不会溢出?
Why does 8086 segment addressing not overflow?
我知道8086的寻址方式是将段寄存器左移四位然后加上偏移量。但是16位寄存器移位后有效位的信息不会丢失吗?
比如段寄存器存0x1000,左移四位不就变成0x0000了吗?
地址计算采用 20 位数学运算。或稍后 CPUs 的更多内容。与输入的宽度不同。 CPU 不会在段 reg!
内移动
在不支持其他模式的 CPU 中(比如基数来自 GDT 的保护模式),我假设选择的段寄存器只是 hard-wired 到位 [20: 4] 是 AGU 中的一个加法器,因此“移位”只是 built-in 到接线。不像你 运行 一个移位指令,结果返回到目的地。
(实际的 8086 没有与其 ALU 分开的 AGU,所以大概这就是使用该逻辑块进行地址数学运算而不是 16 位普通整数数学运算时发生的情况。它还支持 mul
产生 32 位乘积的指令,完成后必须跨 DX:AX 进行拆分,但在内部 ALU 必须跨 16 位边界移动和添加数字才能进行乘法运算。)
我知道8086的寻址方式是将段寄存器左移四位然后加上偏移量。但是16位寄存器移位后有效位的信息不会丢失吗?
比如段寄存器存0x1000,左移四位不就变成0x0000了吗?
地址计算采用 20 位数学运算。或稍后 CPUs 的更多内容。与输入的宽度不同。 CPU 不会在段 reg!
内移动在不支持其他模式的 CPU 中(比如基数来自 GDT 的保护模式),我假设选择的段寄存器只是 hard-wired 到位 [20: 4] 是 AGU 中的一个加法器,因此“移位”只是 built-in 到接线。不像你 运行 一个移位指令,结果返回到目的地。
(实际的 8086 没有与其 ALU 分开的 AGU,所以大概这就是使用该逻辑块进行地址数学运算而不是 16 位普通整数数学运算时发生的情况。它还支持 mul
产生 32 位乘积的指令,完成后必须跨 DX:AX 进行拆分,但在内部 ALU 必须跨 16 位边界移动和添加数字才能进行乘法运算。)