马里奥的绘画

如何用汇编代码画马里奥

基于8086cpu汇编绘画练习

  1. 前言
  2. 代码实现
  3. 练习总结

代码基于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那我存的是颜色。(修改的是对应内存奇地址(偶地址对应的是字符)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值