如何用汇编代码画马里奥
基于8086cpu汇编绘画练习
- 前言
- 代码实现
- 练习总结
代码基于16位的dos系统,直接在32位系统或者64位系统编译运行应该是不兼容的。虽然已经落后时代,但其优点可以更直观地让我们感受到硬件系统和软件系统的交互。而dos系统由于是实模式,我们甚至能篡改系统代码(虽然可能会死机)。并且能够让我们更加了解到cpu是如何进行通过寄存器,内存来进行对其他器件的控制。
本来的小作业是修改字体颜色和背景,但不知怎的,我想到了ASCII码0是空的,我们可以通过只修改背景颜色进行绘画(像素版):
图片大概长这样,代码如下:
assume cs:code,ds:maliao
maliao segment
db 48h,60h
maliao ends
code segment
start:
;background
mov bx,0
mov dx,0
mov ax,0b800h
mov es,ax
mov di,0
mov dh,0h
mov cx, 2000
s:mov es:[di],dh
inc di
mov dl,00010000b
mov es:[di],dl
inc di
loop s
;end of background
;1st
mov ax,maliao
mov ds,ax
mov bx,0
mov di,0
mov ax,0b80ah
mov es,ax
mov di,65
mov cx,10
mov dl,ds:[bx]
t:mov es:[di],dl
inc di
inc di
loop t
;2nd
add ax,0ah
mov es,ax
mov di,61
mov cx,18
mov dl,ds:[bx]
c:mov es:[di],dl
inc di
inc di
loop c
;3rd
add ax,0ah
mov es,ax
mov di,61
mov cx,6
inc bx
mov dh,ds:[bx]
a:or es:[di],dh
inc di
inc di
loop a
mov cx,6
b:mov es:[di],dh
inc di
inc di
loop b
mov cx,2
d:or es:[di],dh
inc di
inc di
loop d
mov cx,2
e:mov es:[di],dh
inc di
inc di
loop e
;4th
add ax,0ah
mov es,ax
mov di,59
mov cx,2
f:or es:[di],dh
inc di
inc di
loop f
mov cx,2
g:mov es:[di],dh
inc di
inc di
loop g
mov cx,2
h:or es:[di],dh
inc di
inc di
loop h
mov cx,7
i:mov es:[di],dh
inc di
inc di
loop i
mov cx,2
j:or es:[di],dh
inc di
inc di
loop j
mov cx,4
k:mov es:[di],dh
inc di
inc di
loop k
;5TH
add ax,0ah
mov es,ax
mov di,59
mov cx,2
l:or es:[di],dh
inc di
inc di
loop l
mov cx,2
m:mov es:[di],dh
inc di
inc di
loop m
mov cx,4
n:or es:[di],dh
inc di
inc di
loop n
mov cx,7
o:mov es:[di],dh
inc di
inc di
loop o
mov cx,2
p:or es:[di],dh
inc di
inc di
loop p
mov cx,5
q:mov es:[di],dh
inc di
inc di
loop q
;6th
add ax,0ah
mov es,ax
mov di,59
mov cx,4
r:or es:[di],dh
inc di
inc di
loop r
mov cx,8
x:mov es:[di],dh
inc di
inc di
loop x
mov cx,8
y:or es:[di],dh
inc di
inc di
loop y
;7th
add ax,0ah
mov es,ax
mov di,67
mov cx,13
z:mov es:[di],dh
inc di
inc di
loop z
mov ax,4c00h
int 21h
code ends
end start
代码比较臃肿,因为我没有思考改善过,我是单纯的穷举修改对应的内存值。maliao segment那我存的是颜色。(修改的是对应内存奇地址(偶地址对应的是字符)。