这个是操作系统的交互页面,用bochs打开后怎么运行
这个是操作系统的交互页面,用bochs打开后在命令行应该输哪几行命令啊。我输入“b 0x8600”,然后输入c,啥也没有显示啊
org 0x8600
jmp start
string db "Welcome Keraint !",0dh,0ah
db "function 1.a 2.b 3.c 4.d",0
error db "error, please try again !"
key db "ab"
FU DB 14H, 04H, 17H, 0FCH, 14H, 44H, 14H, 44H
DB 17H, 0FCH, 14H, 44H, 94H, 44H, 57H, 0FEH
DB 38H, 04H, 13H, 0F8H, 0AH, 08H, 0FAH, 08H
DB 03H, 0F8H, 10H, 00H, 17H, 0FCH, 20H, 08H
start:
mov ax,0
mov ds,ax
mov ax,0xb800
mov es,ax
sti
play:
mov al,[ds:0x8200]
cmp al,2h
je key1
jmp play
key1:
mov al,[ds:0x8201]
cmp al,'a'
je key2
jmp n
key2:
mov al,[ds:0x8202]
cmp al,'b'
je y
jmp n
y:
sti
mov ax,cs
mov es,ax
mov ax,string
mov bp,ax
mov cx,43
call prt
jmp re
re:
mov al,0h
mov [ds:0x8201],al
mov [ds:0x8202],al
mov [ds:0x8203],al
mov [ds:0x8204],al
mov [ds:0x8205],al
mov [ds:0x8200],al
jmp scanf
scanf:
mov al,[ds:0x8200]
cmp al,1h
je num1
jmp scanf
num1:
mov al,[ds:0x8201]
cmp al,'a'
je f1
mov al,[ds:0x8202]
cmp al,'b'
je f2
mov al,[ds:0x8203]
cmp al,'c'
je f3
mov al,[ds:0x8204]
cmp al,'d'
je n
n:
mov ax,cs
mov es,ax
mov ax,error
mov bp,ax
mov cx,25
call prt
jmp re
prt:
mov ah,13h
mov dh,19
mov dl,0
mov bh,0
mov al,0
mov bl,0ah
int 10h
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
f1:
mov ah,0h ;显示器模式
mov al,13h ;256色
int 10h
mov al,0h
mov [ds:0x8201],al
mov [ds:0x8200],al
mov dx,0x3c8;设置调色板
mov al,1 ;颜色号码
out dx,al
mov al,255
mov dx,0x3c9
out dx,al
mov al,0
out dx,al
out dx,al
mov dx,0x3c8;设置调色板
mov al,3 ;颜色号码
out dx,al
mov al,0
mov dx,0x3c9
out dx,al
mov al,255
out dx,al
out dx,al
mov bx,4
mov di,100
mov bh,0 ;显示页码
mov bl,3 ;256调色板一个号码代表一个三原色组成的颜色
int 10h
scanf1:
mov al,[ds:0x8205]
cmp al,'q'
je exit
mov al,[ds:0x8200]
cmp al,1h
je y1
jmp scanf1
y1:
mov ah,0CH ;图形像素
mov bh,0 ;页码
mov al,3 ;像素值
mov cx,0 ;坐标X
mov dx,bx ;坐标Y(把不用改变的量放到循环体外面)
jmp R1
R1:
int 10H
inc cx ;X坐标+1
cmp cx,50 ;显示一个320点的直线
jnz R1 ;CX不为320就继续循环
mov cx,0
jmp R2
R2:
inc dx
cmp dx,di
jnz R1
jmp z
z:
add bx,10
add di,10
mov ah,0CH ;图形像素
mov bh,0 ;页码
mov al,1 ;像素值
mov cx,0 ;坐标X
mov dx,bx ;坐标Y(把不用改变的量放到循环体外面)
jmp next1
next1:
int 10H
inc cx ;X坐标+1
cmp cx,50 ;显示一个50点的直线
jnz next1 ;CX不为50就继续循环
mov cx,0
jmp next2
next2:
inc dx
cmp dx,di
jnz next1
mov al,0h
mov [ds:0x8201],al
mov [ds:0x8202],al
mov [ds:0x8203],al
mov [ds:0x8204],al
mov [ds:0x8205],al
mov [ds:0x8200],al
jmp scanf1
exit:
mov ah,0h ;结束程序
mov al,03h
int 10h
jmp y
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
f2:
mov di,20h ;中断
mov word [cs:di],zongdisplay
mov di,22h
mov word [cs:di],0h
mov si,0h
mov ax,0
mov ds,ax
mov ax,0xb800 ;屏幕显示
mov es,ax
mov cx,0h
sti
jmp $
zongdisplay:
inc cx
mov ax,10h
cmp cx,ax
je display_key
mov ax,20h
cmp cx,ax
je display
mov dx,20h
mov al,20h
out dx,al
iret
display_key:
jmp numb
mov dx,20h
mov al,20h
out dx,al
iret
numb:
mov al,[ds:0x8205]
cmp al,'q'
je return
jmp str1
return:
cli
jmp y
str1:
mov al,[ds:0x8200]
add al,30h
mov byte [es:0x10+160],al ;输出内容
mov byte [es:0x11+160],0x0a ;颜色选择
mov dx,20h
mov al,20h
out dx,al
iret
display:
mov al,'q'
mov [es:si],al
inc si
mov al,01h
mov [es:si],al
inc si
mov cx,0h
mov dx,20h
mov al,20h
out dx,al
iret
;-------------------------------
f3:
mov ax, 0
mov ds, ax
mov ax, 0B800H
mov es, ax
mov si,FU
mov di, 1 * 160+48;出现屏幕位置
call DISP_16_16
jmp y
DISP_16_16:
mov cx, 16;16行16列每个点占四个地址
M_LOOP:
mov dx, [si]
xchg dl, dh; 交换数据
push cx
mov cx, 16
LP1:
add dx,dx
jnc ZZZZ;如果是字则刷黄色
call XS1;背景则刷红色
jmp XXXX
ZZZZ:
call XS0
XXXX:
add di, 4;一次修改了两个位置所以跳过
loop LP1
add si, 2;以两个字节存储
add di, 160-64 ;前面刷了两行64位
pop cx
loop M_LOOP
ret
XS1:
mov ax, 0CE03H ;红底黄字
mov [es:di], ax
mov [es:di + 2], ax;一次修改两个位置
ret
XS0:
mov ax, 0C020H ;红色背景
mov [es:di], ax
mov [es:di + 2], ax
ret