当前位置: 技术问答>linux和unix
关于汇编语言中的标号和变量
来源: 互联网 发布时间:2017-04-08
本文导语: %include "pm.inc" ; 常量, 宏, 以及一些说明 org 0100h jmp LABEL_BEGIN [SECTION .gdt] ; GDT ; 段基址, 段界限 , 属性 LABEL_GDT: Descriptor 0, ...
%include "pm.inc" ; 常量, 宏, 以及一些说明
org 0100h
jmp LABEL_BEGIN
[SECTION .gdt]
; GDT
; 段基址, 段界限 , 属性
LABEL_GDT: Descriptor 0, 0, 0 ; 空描述符
LABEL_DESC_CODE32: Descriptor 0, SegCode32Len - 1, DA_C + DA_32 ; 非一致代码段, 32
LABEL_DESC_VIDEO: Descriptor 0B8000h, 0ffffh, DA_DRW ; 显存首地址
; GDT 结束
GdtLen equ $ - LABEL_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]
[SECTION .s16]
[BITS 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
我的问题:
1.对于最后四行代码中的标号LABEL_DESC_CODE32表示内存首地址还是相对于基址的偏移量?
2.对于声明GdtPtr的时候貌似加不加冒号都无所谓
3.org使程序指针的偏移量置为0100h,那么段基址是多少?
|
1.对于最后四行代码中的标号LABEL_DESC_CODE32表示内存首地址还是相对于基址的偏移量?
=> 基址的偏移
2.对于声明GdtPtr的时候貌似加不加冒号都无所谓
=> 这个属于汇编语言编写问题
3.org使程序指针的偏移量置为0100h,那么段基址是多少?
=> org不作用于PC指针,它会告诉汇编器将org下面产生的机器码按照.text文本段开始位置进行偏移;段基址不变
=> 基址的偏移
2.对于声明GdtPtr的时候貌似加不加冒号都无所谓
=> 这个属于汇编语言编写问题
3.org使程序指针的偏移量置为0100h,那么段基址是多少?
=> org不作用于PC指针,它会告诉汇编器将org下面产生的机器码按照.text文本段开始位置进行偏移;段基址不变