执行mov ss,ax 为何cs的头部会发生变化?(附代码)
assume cs:codecode segment
dw 0123h
dw 0
start: mov ax,cs
mov ss,ax
mov ax,4c00H
int 21h
code ends
end start
在执行完mov ss,ax后,为何cs的开头(076A:00 3)的数据就变成6A 07 A3 01 了,
我理解这里只是把ss设成cs了,为何cs段的开头会发生变化?
在执行指令 mov ss,ax 之后,CS段的开头发生变化的原因是因为在8086处理器中, mov ss,ax 指令实际上是将AX寄存器的值复制到SS寄存器中,而SS寄存器保存的是堆栈段的地址。
在这段代码中, mov ax,cs 指令将当前CS段的值赋给AX寄存器,然后 mov ss,ax 指令将AX寄存器的值复制到SS寄存器中。由于CS和SS寄存器都是16位的,所以AX寄存器中的值会被截断为16位,并复制到SS寄存器中。
由于代码段的开头是 dw 0123h ,它的内存表示形式是 23 01 ,而AX寄存器中的值是 0123h ,所以在执行 mov ss,ax 指令后,SS寄存器中的值变为 0123h ,即 23 01 。
因此,CS段的开头数据变为 6A 07 A3 01 是因为在执行 mov ss,ax 指令后,SS寄存器的值被截断为16位,复制到了CS段的开头位置。 在x86架构中,执行mov ss, ax指令会将寄存器ax的值加载到段寄存器ss中,而不是将ss设为cs的值。因此,执行完mov ss, ax后,并不会导致cs的头部发生变化。
根据你提供的代码片段,我注意到在开始部分使用了assume cs:code语句来指定代码段,这可能导致产生误解。assume语句只是为了告诉编译器某个段寄存器(在此例中是cs)所对应的默认段名(在此例中是code)。这是为了方便在代码中直接使用标签而不必指定具体的段地址。
因此,在执行完mov ss, ax后,cs的头部数据并没有改变,其值仍然是开始部分设定的地址。
如果你有任何其他问题,请随时提问。
如果问题已经解决,请设置最佳答案 【关于mov ss,ax指令导致cs头部变化的解释】
在x86汇编语言中,mov ss, ax指令用于将段寄存器SS的值设置为AX寄存器中的内容。在执行这条指令后,SS寄存器的值会改变,但同时也会影响到CS寄存器。
根据Intel x86处理器的工作原理,当设置新的段寄存器值时,处理器会自动更新段寄存器所引用的段选择子对应的描述符中的基地址和界限信息。而由于CS和SS寄存器都是指向代码段或栈段的选择子,所以修改SS寄存器会导致CS寄存器所引用的描述符也发生变化。
在给出的代码中,假设开始时CS指向了代码段的描述符。当执行mov ss, ax指令后,SS被设置为AX的值,即CS的当前值。因此,SS引用的描述符会与先前的CS相同。由于段描述符以16位形式存储,所以在内存中存储顺序是低字节在前、高字节在后。这就是为什么CS的头部数据发生了变化,具体变化如下:
原始CS头部:076A:00 3
修改后的CS头部:6A 07 A3 01
修改后的CS头部是16位值0x076A,通过字节序颠倒得到0x6A 07。接着,CS引用的描述符中的基地址和界限也会相应更新,导致头部数据变为0xA3 01。
总结起来,当执行mov ss, ax指令时,因为SS和CS都指向段描述符表中的条目,修改SS会影响到CS所引用的描述符,从而使CS的头部数据发生变化。
希望以上解释对你有帮助。如果还有其他问题,请随时提问。
如果回答对你有帮助,请给我一个最佳答案!{:10_254:}{:10_254:}{:10_254:}
isdkz 发表于 2023-8-17 16:20
在执行指令 mov ss,ax 之后,CS段的开头发生变化的原因是因为在8086处理器中, mov ss,ax 指令实际上是将AX ...
回答不对 陶远航 发表于 2023-8-17 16:20
在x86架构中,执行mov ss, ax指令会将寄存器ax的值加载到段寄存器ss中,而不是将ss设为cs的值。因此,执行 ...
那为什么会变呢? jellyprince 发表于 2023-8-17 16:31
那为什么会变呢?
不懂的,他只会用gpt。{:10_304:}
页:
[1]