1. 介绍
编写x86汇编程序,使用编译器编译成二进制文件。开机后用BIOS载入二进制文件,文件可以接管计算机的控制权。
编写的汇编程序除了要控制裸机,还要做到使用显存输出弹球的运动轨迹。
2. 软件
编译器:NASM version 2.14.02
虚拟机程序:VMware 15.5.2
3 编写反弹程序代码
先上代码
jmp near start
delay equ 50000 ;计时器延迟计数,用于控制画框的速度
times_ equ 5; 输出times次A
datadef:
DR_ dw 1 ;D-Down,U-Up,R-right,L-Left
DL_ dw 2 ;
UR_ dw 3 ;
UL_ dw 4 ;四种运动情况
count dd 429496729; 延迟循环次数
x dw 0; 起始位置为(0,0)
y dw 0
iter_times dw 200; 小球运动次数
start:
; 这个地方一定要重新赋值,载入内存之后基址有变化
mov dword[DR_], 1 ;D-Down,U-Up,R-right,L-Left
mov dword[DL_], 1 ;
mov dword[UR_], 1 ;
mov dword[UL_], 1 ;四种运动情况
mov dword[x], 0; dw 0; 起始位置为(0,0)
mov dword[y], 0;y dw 0
mov dword[count], 429496729
mov word[iter_times], 200
mov ax, 0xB800 ;文本窗口显存起始地址
mov gs, ax; gs = 文本框起始地址
mov cx, 1; word[DR_]; 初始状态 为向右下运动
main_loop:
delay_loop:;该循环仅为延迟字符的输出
dec dword[count]; 循环直到count为0
jnz delay_loop; 当ZF标志位为0的时候就跳转
mov dword[count], 429496729
cmp cx, 1; word[DR_]; 开始判断现在运动状态
je dr_; 如果向右下运动,则跳转dr函数
cmp cx, 2;word[DL_]
je dl_; 否则,如果向左下运动则跳转dl
cmp cx, 3;word[UR_]
je ur_; 否则,如果向右上运动跳转ur
cmp cx, 4;word[UL_]
je ul_; 否则,如果向左上运送跳转ul
end_show:
dec word[iter_times]
jnz main_loop; 没有走完所欲的步骤则继续循环,否则进入死循环
jmp $
dr_:
inc word[x]
inc word[y]
mov ax, word[x]
mov bx, word[y]
cmp ax, 79; 首先比较x
jne dr_judge1; 如果x != 79 就跳转判断y
cmp bx, 23; 如果x == 79,继续判断y
jne dr_judge2; 如果x == 79 y != 23 那么到DL_状态
mov cx, 4;word[UL_]; 如果x == 79 y == 23 那么到UL_状态
jmp show
dr_judge2:
mov cx, 2;word[DL_]; 进入DL_状态
jmp show
dr_judge1:
cmp bx, 23; 比较y
jne show; 如果x != 79 y != 23直接进入show打印
mov cx, 3;word[UR_]; 如果x != 79 y == 23 那么到UR_状态
jmp show
dl_:
dec word[x]
inc word[y]
mov ax, word[x]
mov bx, word[y]
cmp ax, 0; 首先比较x
jne dl_judge1; 如果x != 0 就跳转判断y
cmp bx, 23; 如果x == 0,继续判断y
j