这个是操作系统的交互页面,用bochs打开后怎么运行

a925606183 2017-12-06 01:42:53
这个是操作系统的交互页面,用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
...全文
557 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
a925606183 2017-12-07
  • 打赏
  • 举报
回复
请问具体该怎么用,每一个命令行该输入什么。。急急急,求教。。
赵4老师 2017-12-06
  • 打赏
  • 举报
回复
试试在DoxBox下使用。

21,459

社区成员

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

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