<<自己动手写操作系统>>第三章第一节问题

Xexux 2018-05-20 07:30:54
我按照书上的代码写了一遍,但是编译的时候出现错误:
D:\VITTUAL_APPS\BOOTS/保护模式.asm:5: error: comma expected after operand 1
D:\VITTUAL_APPS\BOOTS\pm.inc:6: ... from macro `Descriptor' defined here
D:\VITTUAL_APPS\BOOTS/保护模式.asm:6: error: comma expected after operand 1
D:\VITTUAL_APPS\BOOTS\pm.inc:6: ... from macro `Descriptor' defined here
D:\VITTUAL_APPS\BOOTS/保护模式.asm:7: error: comma expected after operand 1
D:\VITTUAL_APPS\BOOTS\pm.inc:6: ... from macro `Descriptor' defined here
D:\VITTUAL_APPS\BOOTS/保护模式.asm:63: error: invalid operand type
源码:
%include "D:\VITTUAL_APPS\BOOTS\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 0B1000h,0fffh,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 ss,ax
mov sp,0100h

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 edi,(80*10+0)*2
mov ah,0ch
mov al,'P'
mov [gs:edi],ax

jmp $

SegCode32Len equ ($ - LABEL_DESC_CODE32)
怎么解决?
...全文
1547 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
应该是宏不支持dw %2 & 0ffffh这种语句,改成dw %2
Xexux 2018-05-27
  • 打赏
  • 举报
回复
后来修改了一下: %include "D:\VITTUAL_APPS\BOOTS\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 0B1000h,0fffh,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 ss,ax mov sp,0100h 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 edi,(80*10+0)*2 mov ah,0ch mov al,'P' mov [gs:edi],ax jmp $ SegCode32Len equ $ - LABEL_SEG_CODE32 ------------------ pm.inc %macro Descriptor 3 dw %2 & 0ffffh dw %1 & 0ffffh db (%1>>16)&0ffh dw ((%2>>8)&0f00h)|(%3&0f0ffh) db (%1>>24)&0ffh %endmacro DA_C dd ? DA_32 dd ? 又出现以下问题: D:\VITTUAL_APPS\BOOTS/保护模式.asm:6: error: `&' operator may only be applied to scalar values D:\VITTUAL_APPS\BOOTS\pm.inc:6: ... from macro `Descriptor' defined here
  • 打赏
  • 举报
回复
这代码使用NASM语法,估计你用了MASM汇编器

21,453

社区成员

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

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