读书人

汇编 操作系统,该怎么解决

发布时间: 2012-03-09 16:54:57 作者: rapoo

汇编 操作系统
我看了自己动手写操作系统,然后把代码拷到linux下 用nasm 编译后执行 显示can't execute binary file

请大家帮忙看看!!


源文件代码如下test.asm

%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
LABEL_DESC_VIDEO: Descriptor 0B800h,0ffffh,DA_DRW

GdtLen equ $ - LABEL_GDT
GdtPtr dw GdtLen
dd 0

SelectorCode32 equ LABEL_DESC_CODE32 - LABEL_GDT
SelectorVideo equ LABEL_DESC_VIDEO - LABEL_GDT


[SECTION .s16]
[BITS 16]
LABEL_BEGIN:
mov ax,cs
mov ds,ax
mov es,ax
mov ss,ax
mov sp,100h


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



xor eax,eax
mov ax,ds
shl eax,4
add eax,LABEL_GDT
mov dword [GdtPtr + 2],eax


lgdt [GdtPtr]

cli

in al,92h
or al,00000010b
out 92h,al


mov eax,cr0
or eax,1
mov cr0,eax


jmp dword SelectorCode32:0


[SECTION .s32]
[BITS 32]

LABEL_SEG_CODE32:

mov ax,SelectorVideo
mov gs,ax
mov esi,(80*10+0)*2
mov ah,0ch
mov [gs:edi],ax


jmp $

SegCode32Len equ $ - LABEL_SEG_CODE32


pm.inc 源文件如下:



;----------------------------------------
; 描述符类型值说明
; 其中:
; DA_ : Descriptor Attribute
; D : 数据段
; C : 代码段
; S : 系统段
; R : 只读
; RW : 读写
; A : 已访问
; 其它 : 可按照字面意思理解
;----------------------------------------
DA_32EQU4000h; 32 位段

DA_DPL0EQU 00h; DPL = 0
DA_DPL1EQU 20h; DPL = 1
DA_DPL2EQU 40h; DPL = 2
DA_DPL3EQU 60h; DPL = 3
;----------------------------------------
; 存储段描述符类型值说明
;----------------------------------------
DA_DREQU90h; 存在的只读数据段类型值
DA_DRWEQU92h; 存在的可读写数据段属性值
DA_DRWAEQU93h; 存在的已访问可读写数据段类型值
DA_CEQU98h; 存在的只执行代码段属性值
DA_CREQU9Ah; 存在的可执行可读代码段属性值
DA_CCOEQU9Ch; 存在的只执行一致代码段属性值
DA_CCOREQU9Eh; 存在的可执行可读一致代码段属性值
;----------------------------------------
; 系统段描述符类型值说明
;----------------------------------------
DA_LDTEQU 82h; 局部描述符表段类型值
DA_TaskGateEQU 85h; 任务门类型值
DA_386TSSEQU 89h; 可用 386 任务状态段类型值
DA_386CGateEQU 8Ch; 386 调用门类型值
DA_386IGateEQU 8Eh; 386 中断门类型值
DA_386TGateEQU 8Fh; 386 陷阱门类型值
;----------------------------------------


; 选择子图示:
; ┏━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┓
; ┃ 15 ┃ 14 ┃ 13 ┃ 12 ┃ 11 ┃ 10 ┃ 9 ┃ 8 ┃ 7 ┃ 6 ┃ 5 ┃ 4 ┃ 3 ┃ 2 ┃ 1 ┃ 0 ┃
; ┣━━┻━━┻━━┻━━┻━━┻━━┻━━┻━━┻━━┻━━┻━━┻━━┻━━╋━━╋━━┻━━┫
; ┃ 描述符索引 ┃ TI ┃ RPL ┃
; ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┻━━┻━━━━━┛


;
; RPL(Requested Privilege Level): 请求特权级,用于特权检查。
;
; TI(Table Indicator): 引用描述符表指示位
;TI=0 指示从全局描述符表GDT中读取描述符;
;TI=1 指示从局部描述符表LDT中读取描述符。
;

;----------------------------------------
; 选择子类型值说明
; 其中:
; SA_ : Selector Attribute

SA_RPL0EQU0; ┓
SA_RPL1EQU1; ┣ RPL
SA_RPL2EQU2; ┃
SA_RPL3EQU3; ┛

SA_TIGEQU0; ┓TI
SA_TILEQU4; ┛
;----------------------------------------



; 宏 ------------------------------------------------------------------
;
; 描述符
; usage: Descriptor Base, Limit, Attr
; Base: dd
; Limit: dd (low 20 bits available)
; Attr: dw (lower 4 bits of higher byte are always 0)
%macro Descriptor 3
dw%2 & 0FFFFh; 段界限 1(2 字节)
dw%1 & 0FFFFh; 段基址 1(2 字节)
db(%1 >> 16) & 0FFh; 段基址 2(1 字节)
dw((%2 >> 8) & 0F00h) | (%3 & 0F0FFh); 属性 1 + 段界限 2 + 属性 2(2 字节)
db(%1 >> 24) & 0FFh; 段基址 3(1 字节)
%endmacro ; 共 8 字节
;
; 门
; usage: Gate Selector, Offset, DCount, Attr
; Selector: dw
; Offset: dd
; DCount: db
; Attr: db
%macro Gate 4
dw(%2 & 0FFFFh); 偏移 1(2 字节)
dw%1; 选择子(2 字节)
dw(%3 & 1Fh) | ((%4 << 8) & 0FF00h); 属性(2 字节)
dw((%2 >> 16) & 0FFFFh); 偏移 2(2 字节)
%endmacro ; 共 8 字节
; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^



[解决办法]
学习下。。。

读书人网 >汇编语言

热点推荐