关于保护模式下存储段描述符基地址的设置问题

stuman 2007-04-18 06:43:53
; 初始化 32 位代码段描述符
xor eax, eax
mov ax, cs
shl eax, 4
add eax, LABEL_SEG_CODE32
mov word [LABEL_DESC_CODE32 + 2], ax
shr eax, 16
mov byte [LABEL_DESC_CODE32 + 4], al
mov byte [LABEL_DESC_CODE32 + 7], ah
-----------------------------------------------------------
[SECTION .s32]; 32 位代码段. 由实模式跳入.
[BITS 32]

LABEL_SEG_CODE32:
mov ax, SelectorVideo
mov gs, ax ; 视频段选择子(目的)

mov edi, (80 * 10 + 0) * 2 ; 屏幕第 10 行, 第 0 列。
mov ah, 0Ch ; 0000: 黑底 1100: 红字
mov al, 'P'
mov [gs:edi], ax

; 到此停止
jmp $

SegCode32Len equ $ - LABEL_SEG_CODE32
------------------------------------------------------
上面的代码是设置一个代码段描述符,我们看到LABEL_SEG_CODE32是一段代码相对于一个段的偏移地址.在第一段代码中先将当前段的段地址放入了eax,然后加上LABEL_SEG_CODE32.再用这个值来设置描述符的基地址.我想问的是为什么是用当前段的地址(此时处于实模式)加上了相对于另一个段的偏移地址?为什么涉及了两个段?
...全文
261 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
火雲邪神 2007-04-18
  • 打赏
  • 举报
回复
你說你加了另一個段的偏移位, 其實不是, 你認為在LABEL_SEG_CODE32之前是一個段, 在LABEL_SEG_CODE32後就是另一個段, 真搞笑. 一個label怎可能把一個段分成兩份呀.
LABEL_SEG_CODE32之前及之後的代碼, 根本都在cs上, 難道cs的值有變過, 所以是兩個段嗎?

還有, 你很無禮貌, 在QQ群裏答了你, 不出聲, 內地人都是這樣子嗎?
我是群裏的Peter

21,500

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧