关于描述符表的几个小问题
关于描述符表的几个问题
下面的两段汇编代码摘自一本讲述操作系统的书,也许信息有些不全,有哪信息不全的偷偷告诉我吧,我在补充。这书好像不怎么出名,不敢在这说书名和页数,怕被说是做广告的。
关于第二段代码的问题:
1、第二段代码是不是定义一个结构体,类似于C语言的struct?
2、如果是结构体为什么只有成员的类型却没有成员变量名?
3、结构体中的5个成员变量直接在声明的时候就赋值了?
4、第一行“Descriptor”后面的“3” 是啥意思
关于第一段代码的问题:
1、“Deescriptor”好像是用struct声明的一个自定义类型,是不是用这个类型声明了3个变量?
2、声明的这3个变量是不是对成员变量中的3个成员赋值了?剩下两个没赋值?
3、3个变量同名?难不成是数组?
------解决方案--------------------
《30天自制操作系统》
------解决方案--------------------
是《自己动手写操作系统》吧?
关于第二段代码的问题:
1、第二段代码是不是定义一个结构体,类似于C语言的struct?
是汇编语言的宏结构,兼具由宏与结构的作用。这里的作用是定义一段内存空间,可以理解成类似c语言的结构体。
2、如果是结构体为什么只有成员的类型却没有成员变量名?
只有当使用宏的时候才定义内存结构。类似c语言的宏,本身不会占据内存空间。
3、结构体中的5个成员变量直接在声明的时候就赋值了?
类似于c语言的宏函数,每个参数给定值。
4、第一行“Descriptor”后面的“3” 是啥意思
表示该宏带3个参数。每个参数使用%x来引用。
关于第一段代码的问题:
1、“Deescriptor”好像是用struct声明的一个自定义类型,是不是用这个类型声明了3个变量?
就是宏结构定义一个“结构体”。
2、声明的这3个变量是不是对成员变量中的3个成员赋值了?剩下两个没赋值?
每个都有赋值,利用传入的3个值。
3、3个变量同名?难不成是数组?
这3个变量并不同名,分别名为:LABEL_GDT,LABEL_DESC_CODE32,LABEL_DESC_VIDEO。
它们内存空间连续,可以看成是结构体数据。
上面的汇编代码是 nasm 汇编器语法,可下载nasm编译器,然后参考该编译器自带的文档获取更多语法细节。
------解决方案--------------------
%macro Descriptor 3
dw %2 & 0FFFFh ;段界限
dw %1 & 0FFFFh ;段基址1
db (%1 >> 16) & 0FFh ;段基址2
dw ((%2 >> 8) & 0F00h
------解决方案--------------------
(%3 & 0F0FFh);属性1+段界限2+属性2
db (%1 >> 24)& 0FF ;段基址3
%endmacro ;共8字节
这是宏汇编定义的宏指令,和MS的MASM宏汇编有所不同
MS宏汇编大概这么定义
Descriptor macro a,b,c
dw b & 0FFFFh ;段界限
dw a & 0FFFFh ;段基址1
db (a >> 16) & 0FFh ;段基址2
dw ((b >> 8) & 0F00h
------解决方案--------------------
(c & 0F0FFh);属性1+段界限2+属性2
db (a >> 24)& 0FF ;段基址3
Descriptor endm ;共8字节
下面的两段汇编代码摘自一本讲述操作系统的书,也许信息有些不全,有哪信息不全的偷偷告诉我吧,我在补充。这书好像不怎么出名,不敢在这说书名和页数,怕被说是做广告的。
#include"pm.inc"
[SECTION .GDT]
;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 ;显存首地址
;GDT结束
GdtLen equ $ - Leable_GDT ;GDT长度
GdtPtr dw GdtLen - 1 ;GDT界限
dd 0 ;GDT首地址
;GDT选择子
SelectorCode32 equ LABEL_DESC_CODE32 - LABEL_GDT
SelectorVideo equ LABEL_DESC_VIDEO - LABEL_GDT
;END OF [SECTION .gdt]
%macro Descriptor 3
dw %2 & 0FFFFh ;段界限
dw %1 & 0FFFFh ;段基址1
db (%1 >> 16) & 0FFh ;段基址2
dw ((%2 >> 8) & 0F00h | (%3 & 0F0FFh);属性1+段界限2+属性2
db (%1 >> 24)& 0FF ;段基址3
%endmacro ;共8字节
关于第二段代码的问题:
1、第二段代码是不是定义一个结构体,类似于C语言的struct?
2、如果是结构体为什么只有成员的类型却没有成员变量名?
3、结构体中的5个成员变量直接在声明的时候就赋值了?
4、第一行“Descriptor”后面的“3” 是啥意思
关于第一段代码的问题:
1、“Deescriptor”好像是用struct声明的一个自定义类型,是不是用这个类型声明了3个变量?
2、声明的这3个变量是不是对成员变量中的3个成员赋值了?剩下两个没赋值?
3、3个变量同名?难不成是数组?
------解决方案--------------------
《30天自制操作系统》
------解决方案--------------------
是《自己动手写操作系统》吧?
关于第二段代码的问题:
1、第二段代码是不是定义一个结构体,类似于C语言的struct?
是汇编语言的宏结构,兼具由宏与结构的作用。这里的作用是定义一段内存空间,可以理解成类似c语言的结构体。
2、如果是结构体为什么只有成员的类型却没有成员变量名?
只有当使用宏的时候才定义内存结构。类似c语言的宏,本身不会占据内存空间。
3、结构体中的5个成员变量直接在声明的时候就赋值了?
类似于c语言的宏函数,每个参数给定值。
4、第一行“Descriptor”后面的“3” 是啥意思
表示该宏带3个参数。每个参数使用%x来引用。
关于第一段代码的问题:
1、“Deescriptor”好像是用struct声明的一个自定义类型,是不是用这个类型声明了3个变量?
就是宏结构定义一个“结构体”。
2、声明的这3个变量是不是对成员变量中的3个成员赋值了?剩下两个没赋值?
每个都有赋值,利用传入的3个值。
3、3个变量同名?难不成是数组?
这3个变量并不同名,分别名为:LABEL_GDT,LABEL_DESC_CODE32,LABEL_DESC_VIDEO。
它们内存空间连续,可以看成是结构体数据。
上面的汇编代码是 nasm 汇编器语法,可下载nasm编译器,然后参考该编译器自带的文档获取更多语法细节。
------解决方案--------------------
%macro Descriptor 3
dw %2 & 0FFFFh ;段界限
dw %1 & 0FFFFh ;段基址1
db (%1 >> 16) & 0FFh ;段基址2
dw ((%2 >> 8) & 0F00h
------解决方案--------------------
(%3 & 0F0FFh);属性1+段界限2+属性2
db (%1 >> 24)& 0FF ;段基址3
%endmacro ;共8字节
这是宏汇编定义的宏指令,和MS的MASM宏汇编有所不同
MS宏汇编大概这么定义
Descriptor macro a,b,c
dw b & 0FFFFh ;段界限
dw a & 0FFFFh ;段基址1
db (a >> 16) & 0FFh ;段基址2
dw ((b >> 8) & 0F00h
------解决方案--------------------
(c & 0F0FFh);属性1+段界限2+属性2
db (a >> 24)& 0FF ;段基址3
Descriptor endm ;共8字节