关于地址的一些疑问

piaozi2003 2006-04-12 02:04:59
刚开始看《自己动手写操作系统》,发现汇编忘记了不少,其中一个从实模式切换到保护模式饿代码有点疑问请教大家

%include "pm.inc"
org 0100h
jmp LABEL_BEGIN

[SECTION .gdt]
LABEL_GDT: Descriptor 0, 0, 0
LABEL_DESC_CODE32: Descriptor 0, SegCode32Len - 1, DA_C + DA_32
LABEL_DESC_VIDEO: Descriptor 0B8000h, 0ffffh, DA_DRW

GdtLen equ $ - LABEL_GDT ; GDT长度
GdtPtr dw GdtLen - 1 ; GDT界限
dd 0 ; GDT基地址

SelectorCode32 equ LABEL_DESC_CODE32 - LABEL_GDT
SelectorVideo equ LABEL_DESC_VIDEO - LABEL_GDT


[SECTION .s16]
[BITS 16] ;16位代码段
LABEL_BEGIN:
mov ax, cs
mov ds, ax
mov es, ax
mov ss, ax
mov sp, 0100h

; 初始化 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

; 为加载 GDTR 作准备
xor eax, eax
mov ax, ds
shl eax, 4
add eax, LABEL_GDT ; eax <- gdt 基地址
mov dword [GdtPtr + 2], eax ; [GdtPtr + 2] <- gdt 基地址

; 加载 GDTR
lgdt [GdtPtr]

; 关中断
cli

; 打开地址线A20
in al, 92h
or al, 00000010b
out 92h, al

; 准备切换到保护模式
mov eax, cr0
or eax, 1
mov cr0, eax
jmp dword SelectorCode32:0

[SECTION .s32]; 32 位代码段. 由实模式跳入.
[BITS 32]

LABEL_SEG_CODE32:
;这里省略了,就是一些显示字符的内容
jmp $

SegCode32Len equ $ - LABEL_SEG_CODE32
; END of [SECTION .s32]


我就是那段初始化32位代码段的代码有点疑问,问什么先要shl eax,4,
然后再add eax, LABEL_SEG_CODE32呢?
...全文
188 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
xibeilang99 2006-04-12
  • 打赏
  • 举报
回复
左移可能是不需要高4位的数吧!刚好一个字符!
xibeilang99 2006-04-12
  • 打赏
  • 举报
回复
xor eax, eax ;异或操作,清空eax
mov ax, cs ;把cs的值送入ax,这里应该是eax吧
shl eax, 4 ;把eax中的值逻辑左移4位
add eax, LABEL_SEG_CODE32 ;左移后把LABEL_SEG_CODE32相加eax在存入eax啊
piaozi2003 2006-04-12
  • 打赏
  • 举报
回复
上面用的是nasm的语法,汇编忘记的差不多了,请大家不要笑话

21,458

社区成员

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

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