x86入门-接管裸机控制权

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
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值