QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2610|回复: 4

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

[复制链接]
发表于 2005-8-3 16:26:48 | 显示全部楼层 |阅读模式
有那几种方式修改了CS?
我迷惑了
发表于 2005-8-6 13:22:44 | 显示全部楼层
call
jmp
回复

使用道具 举报

 楼主| 发表于 2005-8-8 08:52:28 | 显示全部楼层
非常感谢楼上,但是下面这段程序怎么解释
我认为执行boot这段程序时,由bios直接跳转的,段地址应该随之改变。不用下面这么罗嗦吧。
劳驾详细解释一下。
; boot.asm

[ORG 0]

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

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

..........
回复

使用道具 举报

发表于 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段内定义的变量,一访问变量就错了。它会访问到其他地方去。因为访问变量用的是绝对的地址。
回复

使用道具 举报

发表于 2005-8-30 14:18:40 | 显示全部楼层
透彻
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-5-4 16:19 , Processed in 0.131845 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

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