xiadz 发表于 2005-8-3 16:26:48

谁知道x86cpu的CS寄存器是如何变化的?

有那几种方式修改了CS?
我迷惑了

solar 发表于 2005-8-6 13:22:44

call
jmp

xiadz 发表于 2005-8-8 08:52:28

非常感谢楼上,但是下面这段程序怎么解释
我认为执行boot这段程序时,由bios直接跳转的,段地址应该随之改变。不用下面这么罗嗦吧。
劳驾详细解释一下。
; boot.asm



      jmp 07C0h:start   ; 跳转到段07C0

start:
      ; 设置段寄存器
      mov ax, cs
      mov ds, ax
      mov es, ax

..........

keenor 发表于 2005-8-26 00:25:29

这样写没错
引导扇区被bios读到内存0x7c00,然后从那个地址开始执行
org0 的意思是让汇编器从0开始计地址,然而代码在0x07c00那个地方,上面代码的方法是把段地址变成0x7c0(jmp 07c0h:start),这样就跟实际情况一致了
jmp跟call有两种,你看机器码的话会比较清楚,一种是相对跳转,如jmp start,机器码中放的是目标地址到当前地址的间隔距离,两一种是绝对跳转,如上面的jmp 07c0h:start,机器码中放的是段地址跟偏移量的绝对值。
如果上面的代码不使用那个绝对跳转,cs跟ip无法真实反映实际运行的地址,这种情况下,相对的jmp跟call是没有问题的,因为相对跳转本来就只需要知道往前或往后多少字节就行了。但不能访问cs段内定义的变量,一访问变量就错了。它会访问到其他地方去。因为访问变量用的是绝对的地址。

xue_hu2001 发表于 2005-8-30 14:18:40

透彻
页: [1]
查看完整版本: 谁知道x86cpu的CS寄存器是如何变化的?