汇编课程设计
;一对令人羡慕的情侣相约在爱情海,就在那里,二人度过了那难忘的情人节,并且,二人的感情得到闪电般的升华,过后二人闪电般结婚了,在鸟儿和花儿的陪伴下。
Pushr macro x,y,z,w Push x Push y Push z Push w Endm;堆栈顶数据弹出到寄存器宏定义Popr macro x,y,z,w Pop w Pop z Pop y Pop xEndm;定义堆栈段Stacks segment Dw 256 dup(?)Stacks ends;定义数据段Data segment ;string db ' THEY ARE SO HAPPY 'strlen equ $-stringRobot1 db 13 ;机器人由7个符号组成,再加上滑板车气球和桃心 Db 5ch,8eh,0,0 ;左手,字符属性,行偏移,列偏移 Db 08h,06h,0,1 ;胸部,字符属性,行偏移,列偏移 Db 2fh,8eh,0,1 ;右手,字符属性,行偏移,列偏移 Db 0b3h,0fh,-1,1 db 02h,04h,-1,0 Db 0dbh,0ah,3,-2 ;腹部,字符属性,行偏移,列偏移 Db 13h,7h,1,0 ;两腿,字符属性,行偏移,列偏移 db 1ah,0eh,1,-1 ;滑板车 db 1ah,0eh,0,1 db 1ah,0eh,0,1 Db 02h,84h,-4,-1 ;面部,字符属性,行偏移,列偏移 Db 0b3h,94h,-1,0 ;天线,字符属性,行偏移,列偏移 Db 03h,0eh,0,10 robot2 db 255 ; 机器人由7和符号组成,再加上花儿,星星和桃心 Db 5ch,0eh,0,0 ;左手,字符属性,行偏移,列偏移 Db 08h,0bh,0,1 ;胸部,字符属性,行偏移,列偏移 Db 2fh,0eh,0,1 ;右手,字符属性,行偏移,列偏移 Db 0b3h,0fh,-1,1 ;花儿 db 0fh,1eh,-1,0 Db 1eh,02h,3,-2 ;腹部,字符属性,行偏移,列偏移 Db 13h,7h,1,0 ;两腿,字符属性,行偏移,列偏移
Db 02h,84h,-3,0 ;面部,字符属性,行偏移,列偏移 Db 0b3h,94h,-1,0 ;天线,字符属性,行偏移,列偏移 db 0b1h,11h,-4,30 ;大海 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-2 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 0b1h,11h,0,-1 db 03h,0eh,-8,16 ;星星 Db 03h,0eh,-1,0 Db 03h,0eh,0,6
Db 03h,0eh,-1,42 Db 03h,0eh,4,-6 Db 03h,0eh,-2,10 Db 03h,0eh,1,1 Db 03h,0eh,-2,6 Db 03h,0eh,0,1 Db 03h,0eh,-5,4 Db 03h,0eh,0,1 Db 03h,0eh,-1,6 Db 03h,0eh,2,-2 Db 03h,0eh,0,1 db 03h,0eh,0,8 db 0fah,0eh,10,-9 db 0fah,0eh,1,-4 db 0fah,0eh,-7,2
db 03h,04h, 0,33 ;桃心 db 03h,04h,1,1 db 03h,04h,1,1 db 03h,04h,1,1 db 03h,04h,1,1 db 03h,04h,1,1 db 03h,04h,1,1 db 03h,04h,1,1 db 03h,04h,1,1 db 03h,04h,-1,1 db 03h,04h,-1,1 db 03h,04h,-1,1 db 03h,04h,-1,1 db 03h,04h,-1,1 db 03h,04h,-1,1 db 03h,04h,-1,1 db 03h,04h,-1,1 db 03h,04h,-1,-1 db 03h,04h,-1,-1 db 03h,04h,0,-1 db 03h,04h,0,-1 db 03h,04h,0,-1 db 03h,04h,0,-1 db 03h,04h,1,-1 db 03h,04h,1,-1 db 03h,04h,-1,-1 db 03h,04h,-1,-1 db 03h,04h,0,-1 db 03h,04h,0,-1 db 03h,04h,0,-1 db 03h,04h,0,-1 db 03h,04h,1,-1 db 03h,04h,1,-1 Robot3 db 20 ;二人结婚了 db 0cfh,75h,0,0 ;车 db 0cfh,75h,0,1 db 0cfh,75h,0,1 db 0cfh,75h,0,1 db 0cfh,75h,0,1 db 0cfh,75h,0,1 db 0cfh,75h,0,1 db 0cfh,75h,0,1 db 0fh,0eh,1,0 db 0fh,0eh,0,-7 db 0e8h,04h,-2,2 db 0e8h,04h,0,1 db 0eh,75h,0,3 Db 76h,10,-2,2 ;鸟 Db 0c4h,7h,0,1 Db 76h,10,-2,2 Db 0c4h,7h,0,1 Db 76h,10,-2,2 Db 0c4h,7h,0,1 Db 76h,10,-2,2 Db 0c4h,7h,0,1 Db 76h,10h,2,-2 Db 0c4h,7h,0,1 Db 76h,10,2,-2 Db 76h,10,2,-2 Db 0c4h,7h,0,1 Robot4 db 200 db 0fh,0eh,0,0 ;花 db 0fh,0eh,-13,1 db 0fh,0fh,0,3 db 0fh,0eh,-1,5 db 0fh,0ch,-1,15 db 0fh,0dh,2,26 db 0fh,0eh,2,-17 db 0fh,06h,-3,10 db 0fh,0eh,1,-10 db 0fh,03h,-2,15 db 0fh,0eh,1,-5 db 0fh,0eh,1,-10 db 0fh,0fh,0,3 db 0fh,0eh,-1,5 db 0fh,0dh,2,26 db 0fh,0eh,2,-17 db 0fh,06h,-3,10 db 0fh,03h,-2,15 db 0fh,0eh,1,-5 db 0fh,0ah,-2,2 db 0fh,0fh,1,-8 db 0fh,0eh,-1,6 db 03h,04h, -2,-10 ;桃心 db 03h,04h,1,1 db 03h,04h,1,1 db 03h,04h,1,1 db 03h,04h,1,1 db 03h,04h,1,1 db 03h,04h,1,1 db 03h,04h,1,1 db 03h,04h,1,1 db 03h,04h,-1,1 db 03h,04h,-1,1 db 03h,04h,-1,1 db 03h,04h,-1,1 db 03h,04h,-1,1 db 03h,04h,-1,1 db 03h,04h,-1,1 db 03h,04h,-1,1 db 03h,04h,-1,-1 db 03h,04h,-1,-1 db 03h,04h,0,-1 db 03h,04h,0,-1 db 03h,04h,0,-1 db 03h,04h,0,-1 db 03h,04h,1,-1 db 03h,04h,1,-1 db 03h,04h,-1,-1 db 03h,04h,-1,-1 db 03h,04h,0,-1 db 03h,04h,0,-1 db 03h,04h,0,-1 db 03h,04h,0,-1 db 03h,04h,1,-1 db 03h,04h,1,-1
Count dw 0 ;保存字符个数Pointer dw 0 ;保存字符首地址Line db 0 ;保存行号 Column db 0 ;保存列号Data ends
Codes segment Assume cs:codes,ds:data,es:data,ss:stacksStart: mov ax,data Mov ds,ax Mov es,ax ;设置为80×25彩色文本方式 mov ah,0 mov al,3 int 10h call clear ;清屏幕 mov ah,0 lea bp,string mov cx,strlen mov dx,0101h mov bh,0 mov bl,9eh mov al,0 mov ah,13h int 10h mov ah,7 int 21h Lea si,robot2 ;数据段首地址送DI Mov dx,1480h ;显示的起始行号和列号 Mov bh,0 Call moves1 Lea di,robot1 ;数据段首地址送DI Mov dx,1400h ;显示的起始行号和列号 Mov bh,0 Call moves ;调用MOVES子程序 call delay ;清屏幕 call clear Lea si,robot4 ;数据段首地址送DI Mov dx,1440h ;显示的起始行号和列号 Mov bh,0 Call moves1 Lea di,robot3 ;数据段首地址送DI Mov dx,1400h ;显示的起始行号和列号 Mov bh,0 Call moves ;调用MOVES子程序 Mov ah,4ch ;主程序结束返回DOS Int 21h
Moves1 proc ;机器人移动子程序 Pushr ax,bx,cx,dx ;保存寄存器内容 Push si Xor ch,ch Mov cl,[si] ;字符个数送CX Inc si ;指向第一个显示符 Mov count,cx ;保存字符个数 Mov pointer,si ;保存字符首地址 Mov line,dh ;保存行号 Mov column,dl ;保存列号Next1: add dh,[si+2] ;根据偏移值计算下 Add dl,[si+3] ;计算列号 ;判断是否到屏幕最右端
mov ah,2 Int 10h ;设置光标位置 Mov al,[si] ;取字符 Mov bl,[si+1] ;取字符属性 Push cx ;保存计数值 ;设置写彩色字符 mov ah,9 mov cx,1 int 10h
Pop cx ;恢复计数值 Add si,4 ;指向下一个显示字 Loop next1 ;机器人没画完转 Pop si Popr ax,bx,cx,dx RetMoves1 endp
Moves proc ;机器人移动子程序 Pushr ax,bx,cx,dx ;保存寄存器内容 Push di Xor ch,ch Mov cl,[di] ;字符个数送CX Inc di ;指向第一个显示符号 Mov count,cx ;保存字符个数 Mov pointer,di ;保存字符首地址 Mov line,dh ;保存行号 Mov column,dl ;保存列号Next: add dh,[di+2] ;根据偏移值计算下一个符号的行号 Add dl,[di+3] ;计算列号 Cmp dl,50;判断是否到屏幕最右端 Jb write ;否,继续画 Cmp dh,10;判断是否到屏幕最右端 Jb write ;否,继续画 Pop di Popr ax,bx,cx,dx Ret
Write: mov ah,2 Int 10h ;设置光标位置 Mov al,[di] ;取字符 Mov bl,[di+1] ;取字符属性 Push cx ;保存计数值 ;设置写彩色字符 mov ah,9 mov cx,1 int 10h
Pop cx ;恢复计数值 Add di,4 ;指向下一个显示字符 Loop next ;机器人没画完转next Call delay ;延时子程序 Call Erase ;清除机器人子程序 Jmp short nextMoves endp Erase proc Mov cx,count ;字符个数送CX Mov di,pointer ;字符首地址送DI Mov dh,line ;行号送DH Mov dl,column ;列号送DLl: add dh,[di+2] ;根据相对偏移计算行号 mov ah,2 ;设置光标位置 add dl,[di+3] int 10h mov al,[di] ;取字符 mov bl,0 ;字符属性为黑底黑字 push cx mov ah,9 ;写字符 mov cx,1 int 10h pop cx add di,4 ;指向下一个字符 loop l ;未清除完转L mov cx,count ;为重画机器人做准备 mov di,pointer mov dh,line inc column ;inc向左走,dec向右走 mov dl,column reterase endp
delay proc ;延时子程序 pushr ax,bx,cx,dx mov dx,4000hgo: mov cx,4000hrepeat: loop repeat dec dx jne go popr ax,bx,cx,dx retdelay endp
clear proc ;清屏幕子程序 pushr ax,bx,cx,dx mov bh,7 mov dx,184fh mov ax,0600h mov cx,0 int 10h popr ax,bx,cx,dx retclear endp
codes ends end start