首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

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

2012-03-09 
汇编操作系统我看了自己动手写操作系统,然后把代码拷到linux下用nasm 编译后执行显示cant executebinary

汇编 操作系统
我看了自己动手写操作系统,然后把代码拷到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 字节
; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^



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

热点排行