时钟显示程序-微型计算机技术1、 实验内容或题目显示系统时间的程序,运行时,在屏幕的右上角将以“时:分:秒”的形式显示本机系统的时间。该程序只能在DOS下运行。报时小闹钟。本程序是一个用汇编编的精致的图形时钟,运行时双击clock图标即可,钟表显示的时间为本机系统的时间。按b键可扩大画面 ;按s键可缩小画面;按c键可改变颜色;按e键可听音乐;按q键退出本程序.
2、实验目的与要求(1)掌握汇编语言源程序的编辑、汇编、连接的方法,DEBUG调试命令及其使用方法(2)熟悉文本编辑程序的使用方法,以建立汇编语言源程序。(3)初步掌握源程序中语法错误的检查方法。(4)熟悉汇编语言的汇编、连接和运行过程。
3、 实验步骤与源程序 ⑴ 实验步骤 一 汇编语言上机过程1.编辑源程序,建立ASM文件在DOS下,我们可以调用任何一种文本编辑软件编辑汇编语言的源程序,现在,我们调用全屏幕编辑程序EDITC>EDIT在磁盘上建立以.asm为后缀的源文件2.用汇编程序(MASM)对源文件汇编产生文件OBJ文件源文件建立之后,要用汇编程序对源文件汇编,汇编产生二进制的目标文件(OBJ文件),操作如下:格式:MASM<文件名>3.用连接程序(LINK)产生执行文件EXE汇编程序生成的二进制的目标文件并不是可以执行的文件,还必须使用连接程序(LINK)把OBJ文件转换为可执行的EXE文件格式:LINK<文件名>
二 调试程序DEBUG的主要命令DEBUG程序是专门为汇编语音设计的一种调试工具1. DEBUG程序的调用在DOS下,键入命令C>DEBUG[驱动器][路径][文件名]在DEBUG程序调入后,出现提示符“-”,此时,可键入所需的DEBUG命令2. 常用DEBUG命令(1) 显示内存单元内容的命令D,格式为-D(2) 修改内存单元内容的命令E,格式为-E(3)检查和修改寄存器内容的命令R,格式为-R(4)运行命令G,格式为-G(5)汇编命令A,格式为-A(6)反汇编命令U,格式-U(7)推出DEBUG命令Q,该命令格式为-Q 上机要求:文件夹masm5子文件aaa已有88.ASM为文件名的源文件,通过调用程序DEBUG的主要命令,熟悉各种命令的用法。 ⑵ 源代码 见附录 4、 测试数据与实验结果(可以抓图粘贴)题目一:显示系统时间的程序图1注:进入DOS,用编辑软件建立的源程序.ASM文件,必须经过汇编才能产生.OBJ文件。
图2注:以下信息中方括中为该项提示的缺省回答值,冒号后面等待用户输入信息,若不改变缺省值则直接按回车键。汇编后生成SYSTIME.OBJ文件
图3注:生成的.OBJ文件,其所有目标代码的地址都是浮动的偏移地址,机器不能直接运行。必须用连接程序(LINK.EXE)对其进行连接装配定位,产生.EXE可执行文件,方可运行。
图4注:经过汇编、连接后生成的.EXE文件,可在DOS系统直接运行,只要键入相应的文件名即可。可在屏幕右上角看到显示的系统文件。216
时钟显示程序-微型计算机技术题目二:报时小闹钟图5注:经过汇编才能产生.OBJ文件最后信息提示: ×× Warning errors (警告错误) ×× Severe errors (严重错误)若严重错误总数不为0,则.OBJ文件没有生成,需回到编辑状态下修改源程序直到无错为止。
图6注:发现错误,进DOS下修改,用edit clock.asm命令图7注:musi文件通过汇编图8注:musi,连接目标程序,程序缺少clock,不可运行 图9注:汇编sound,程序出现问题 5、 结果分析与实验体会本次实验是我们微型计算机的第二次实验。实验内容是汇编语言,时钟显示程序。实验的第一题是在DOS下运行显示系统时间的程序,运行时,在屏幕的右上角将以“时:分:秒”的形式显示本机系统的时间。这个老师已经给了我们源程序,asm文件。首先进入DOS状态,用masm进行汇编,结果没有错误,生成.obj文件。然后用link 命令连接目标程序,可生成 .exe文件。经过汇编、连接后生成的.EXE文件,可在DOS系统直接运行,只要键入相应的文件名即可。右上角出现了系统时间。便完成了实验的第一题。 实验的第二题是报时小闹钟。按照第一题的方法进行汇编,但是程序出现问题,提示在第26,48,411行出现问题,进行修改。后来老师再次发了那个源程序给我们。但是还是有问题,经过讨论和修改,老师说可能使DEBUG的问题,做到这里便可。 本次实验使我们再次接触了汇编程序,对汇编语言有了更深一步地理解。汇编语言是低级机器语言,但在我们的计算机学习过程中是非常重要的。许多课程都与汇编语言相关,可直接看到机器系统的运行。我们需要更加努力的学习汇编语言,将课堂上的理论知识转换成我们的实际上机操作。学习好微型计算机这门课程会在我们整个计算机的本科学习阶段非常的有用。所以我们要花更多的时间和精力学习好这门课程。
时钟显示程序-微型计算机技术extrn music:far,gensound:far;******************************************************;* 堆栈段 .286;******************************************************STACK_SEG SEGMENT STACK STACK_BUF DW 120 DUP(?) TOP EQU $-STACK_BUFSTACK_SEG ENDS;******************************************************;* 数据段 ;******************************************************DATA_SEG SEGMENT PARA;------------------------------------------------------; TODO: 数据的定义及存储器的分配ts1 DB 0quitbuf DB 'welcome you to run this programme. ' quitbuf2 DB 'C: change color; B:extend the colck; S:reduce the clock ' quitbuf3 DB 'press e to sound; Press q to quit ! ' sigle DB 80h absx DW 0 absy DW 0 sut DW 0erroybz DB 0 r0 DW 90x0 DW 320y0 DW 245
count0 db 0 count_hour DB 11 count_minute DB 11yuanxinx DW 0yuanxiny DW 0 s DB 0s2 DB 0 s3 DB 0hour DW 0hour2 DW 0 minute DW 0minute2 DW 0 second DB 0 second2 DB 0 sin_x DW 0sin_xx DW 0 x DW 0y DW 0x1 DW 0 xminy DW 0yminx DW 0 xmax DW 0 ymax DW 0 ymin DW 0xmin DW 0 sjx_xminy DW 0sjx_yminx DW 0 sjx_xmax DW 0 sjx_ymax DW 0 sjx_ymin DW 0sjx_xmin DW 0 yuanx DW 0yuany DW 0 y1 DW 0x2 DW 0y2 DW 0x3 DW 0y3 DW 0 DIancolor DB 0 color DB 2color_hour DB 2color_min DB 6color_second DB 9 color4 DB 10color5 DB 11color6 DB 12 backgroundcolor DB 1 page1 DB 0y2y1 DW 0 x2x1 DW 0 sjx_y2y1 DW 0 sjx_x2x1 DW 0 ;------------------------------------------------------
DATA_SEG ENDS;******************************************************;* 代码段 ;******************************************************CODE_SEG SEGMENT PARA;------------------------------------------------------MAIN PROC FAR ASSUME CS:CODE_SEG,DS:DATA_SEG ASSUME SS:STACK_SEGSTART: MOV AX,STACK_SEG MOV SS,AX MOV SP,TOP MOV AX,DATA_SEG MOV DS,AX;------------------------------------------------------; TODO: 从这里开始您的代码;------------------------------------------------------ beg: MOV AX,0012h INT 10h MOV DX,0010h CALL b1002 LEA BP,quitbuf CALL msg MOV DX,010ah LEA BP,quitbuf2 CALL msg MOV DX,020ah LEA BP,quitbuf3 CALL msg beg2: CALL skin CALL skin2 CALL skin3 CALL CLk MOV second,DH MOV second2,DH MOV count_minute,11 CALL minute_lin XOR DX,DX MOV AX,minute2 MOV CX,12 DIV CX MOV CX,AX ;minurte2/12 POP AX ADD AX,CX MOV hour2,AX MOV count_hour,11 CALL hour_lin CALL CLk MOV DL,DH CALL bcd2 XOR AH,AH MOV CL,12 DIV CL MOV count_minute,AH ;second%12初始值 DEC count_minute XOR DX,DX MOV AX,minute2 MOV CX,12 DIV CX ;minurte2%12 MOV count_hour,DL DEC count_hour INC second2kk3: CLI CALL second_lin STI JMP ks ks: MOV AH,1 INT 16h JZ kk3 MOV AH,8 INT 21h CMP AL,'q' JE quit CMP AL,'b' JE CHange_rb CMP AL,'s' JE CHange_rs CMP AL,'c' JE CHange_color cmp al,'e' je a0 JMP kk3
CHange_rs: CMP r0,190 JA ks ADD r0,5 JMP tobeg2 CHange_rb: CMP r0,60 JB ks SUB r0,5 JMP tobeg2 CHange_color: LEA SI,color_hour MOV CX,6CHange_kk1: MOV AL, [SI] INC AL CMP AL,15 JC CHange_color_kk2 MOV AL,1CHange_color_kk2: MOV [SI],AL INC SI LOOP CHange_kk1 JMP tobeg2a0: call music call music call musictobeg2: CALL CLear JMP beg2 quit: MOV AX,4C00H INT 21H ;************************************* hour_lin PROC NEAR PUSHa CMP count_hour,11 JB tohour_yl JMP hour_lin_nexttohour_yl: MOV SIgle,3 JMP hour_ylhour_lin_next: MOV count_hour,0 MOV SIgle,5 CALL CLk MOV DL,CH CALL bcd2 CMP AL,12 JB hour_kk1 SUB AL,12hour_kk1: MOV CL,30 MUL CL PUSH AX XOR DX,DX MOV AX,minute2 MOV CX,12 DIV CX MOV CX,AX ;minurte2/12 POP AX ADD AX,CX MOV hour2,AX ;擦掉 MOV Color,0 MOV AX,hour MOV BX,r0 ADD BX,20 CALL renovate MOV DX,yuanx MOV x3,DX MOV DX,yuany MOV y3,DX ADD AX,270 ADD BX,400 ;90 CALL renovate MOV DX,yuanx ;擦掉 MOV x2,DX MOV DX,yuany MOV y2,DX MOV DX,x0 MOV x1,DX MOV DX,y0 ;擦掉 MOV y1,DX CALL sjx ADD AX,180 CALL renovate MOV DX,yuanx ;擦掉 MOV x2,DX MOV DX,yuany MOV y2,DX SUB BX,100 CALL renovate MOV DX,yuanx MOV x3,DX MOV DX,yuany MOV y3,DX ;擦掉 CALL sjx MOV SIgle,4 ;***************************;; ;重写 hour_yl: MOV AL,color_hour MOV color,AL MOV AX,hour2 MOV BX,r0 ADD BX,70 CALL renovate MOV DX,yuanx MOV x3,DX MOV DX,yuany MOV y3,DX ADD AX,90 ADD BX,600 ;90 CALL renovate MOV DX,yuanx MOV x2,DX MOV DX,yuany MOV y2,DX ;重写 ADD AX,180 CALL renovate MOV DX,yuanx MOV x1,DX MOV DX,yuany MOV y1,DX CALL sjxx CALL sjxy ADD AX,270 SUB BX,100 CALL renovate MOV DX,yuanx MOV x3,DX ;重写 MOV DX,yuany MOV y3,DX CALL sjx CALL sjxx CALL sjxy MOV CX,hour2 MOV hour,CXhour_quit: POPa REThour_lin ENDP ;******************************** minute_lin PROC NEAR PUSHa CMP count_minute,11 JB tominute_yl ;仍是原来的一个 JMP minute_lin_nexttominute_yl: MOV SIgle,0 JMP minute_ylminute_lin_next: INC count_hour CALL CLk MOV DL,CL CALL bcd2 ;bcd->16 MOV CL,6 MUL CL ;al*cl PUSH AX MOV DL,second2 CALL bcd2 XOR AH,AH MOV CL,12 DIV CL MOV CL,AL ;second2/12 POP AX MOV CH,0 ADD AX,CX MOV minute2,AX AAAa1: MOV SIgle,2 MOV Color,0 MOV AX,minute MOV BX,r0 ADD BX,10 CALL renovate MOV DX,yuanx MOV x3,DX MOV DX,yuany MOV y3,DX ADD AX,268 ADD BX,800 ;90 CALL renovate MOV DX,yuanx MOV x2,DX MOV DX,yuany MOV y2,DX MOV DX,x0 MOV x1,DX MOV DX,y0 MOV y1,DX CALL sjx ADD AX,180 CALL renovate MOV DX,yuanx MOV x2,DX MOV DX,yuany MOV y2,DX ADD AX,90 SUB BX,200 CALL renovate MOV DX,yuanx MOV x3,DX MOV DX,yuany MOV y3,DX CALL sjx inc count0 cmp count0,5 jnz minute_yl mov count0,0 call music call music call music ;**********************************重写 minute_yl: MOV sigle,1 MOV AL,color_min MOV color,AL MOV AX,minute2 MOV BX,r0 ADD BX,30 CALL renovate MOV DX,yuanx MOV x3,DX MOV DX,yuany MOV y3,DX ADD AX,90 ADD BX,900 ;90 CALL renovate MOV DX,yuanx MOV x2,DX MOV DX,yuany MOV y2,DX ADD AX,180 CALL renovate MOV DX,yuanx MOV x1,DX MOV DX,yuany MOV y1,DX CALL sjxx CALL sjxy ADD AX,270 SUB BX,200 CALL renovate MOV DX,yuanx MOV x3,DX MOV DX,yuany MOV y3,DX CALL sjxx CALL sjxy MOV CX,minute2 MOV minute,CX CALL hour_lin minute_kk1: minute_quit: POPa RETminute_lin ENDP ;******************in dh秒数********************* second_lin PROC NEAR PUSHa CALL CLk CMP second2,DH JE to_second_quit JMP second_lin_nextto_second_quit:JMP second_quitsecond_lin_next: MOV SIgle,80h MOV second2,DH MOV Color,0 MOV DL,second ;erase CALL bcd2 MOV AH,0 MOV CL,6 MUL CL MOV BX,r0 ADD BX,10 CALL renovate MOV DX,yuanx MOV x1,DX MOV DX,yuany MOV y1,DX ADD AX,180 ADD BX,300 CALL renovate MOV DX,yuanx MOV x2,DX MOV DX,yuany MOV y2,DX CALL linex CALL liney ;重写 MOV SIgle,80h MOV AL,color_second MOV color,AL MOV DL,second2 CALL bcd2 MOV AH,0 MOV CL,6 MUL CL MOV BX,r0 ADD BX,10 CALL renovate MOV DX,yuanx MOV x1,DX MOV DX,yuany MOV y1,DX ADD AX,180 ADD BX, 300 CALL renovate MOV DX,yuanx MOV x2,DX MOV DX,yuany MOV y2,DX CALL linex CALL liney CALL yuanxin MOV DL,second2 MOV second,DL CALL minute_lin CALL skin2 MOV CL,second2 MOV second,CL CMP count_minute,11 JE second_kk1 INC count_minute JMP second_quitsecond_kk1: MOV count_minute,0 second_quit: POPa RETsecond_lin ENDP ;******bxbbx*********in ax度数***bx长度,********* ;OUT x2->ax,y2->dx ;**renovate PROC NEAR PUSHa ADD AX,270 PUSH AX CALL SIn MOV DX,0 MOV CX,BX DIV CX CMP SI,1 JE hjian ADD AX,y0 JMP renovate_kk1hjian: MOV CX,y0 SUB CX,AX MOV AX,CXrenovate_kk1: MOV yuany,AX POP AX CALL cos MOV DX,0 MOV CX,BX DIV CX CMP SI,1 JE hjian2 ADD AX,x0 JMP renovate_kk2hjian2: MOV CX,x0 SUB CX,AX MOV AX,CXrenovate_kk2: MOV yuanx,AX POPa RETrenovate ENDP ;************************** Clk PROC MOV AH,2 INT 1ah RETCLk ENDP ;*****************cosx in ax out ax ,si符号****************** cos PROC NEAR ADD AX,90 cos_kk1: CALL SIn RETcos ENDP ;*********Sinx in ax out ax ,si符号******************************* SIn PROC NEAR ;out ax
PUSH CX PUSH DX PUSH BXsin360: CMP AX,90 JA dy90sto0_90: MOV SI,0 JMP pp1dy90: CMP AX,180 JBE z91to180 JMP dy180z91to180: MOV CX,180 SUB CX,AX MOV AX,CX MOV SI,0 JMP pp1z181to270: SUB AX,180 MOV SI,1 JMP pp1z271to360: CMP AX,359 JA zdy359 MOV CX,360 SUB CX,AX MOV AX,CX MOV SI,1 JMP pp1zdy359: SUB AX,360 JMP SIn360 dy180: CMP AX,270 JBE z181to270 JMP z271to360 pp1: MOV CX,175 XOR DX,DX MUL CX MOV sin_x,AX XOR DX,DX MOV CX,AX MUL CX MOV CX,10000 DIV CX MOV sin_xx,AX XOR DX,DX MOV CX,120 DIV CX MOV BX,1677;1667 CALL SUBab MOV CX,sin_xx XOR DX,DX MUL CX MOV CX,10000 DIV CX ;xx(xx/120-10000/6) MOV CX,10000 MOV DL,0 CMP DL,s JE jia SUB CX,AX MOV AX,CX JMP kk1jia: ADD AX,CXkk1: MOV CX,sin_x XOR DX,DX MUL CX MOV CX,10000 DIV CX POP BX POP DX POP CX MOV s,0 RET SIn ENDP ;**************;绝对值在ax中符号在S中ax-bx*****s要定义db*************subab PROC CMP AX,BX JAE goab XOR s,1 XCHG AX,BXgoab: SUB AX,BX RETsubab ENDP ;***************************linex***y=(y2-y1)*(x-x1)/(x2-x1)+y1;****in (x1,y1),(x2,y2)******************x++ linex PROC NEAR PUSH x1 PUSH x2 PUSH y1 PUSH y2 pusha CALL xymaxmin MOV AX,y2 MOV BX,y1 CALL subab MOV y2y1,AX MOV AX,x2 MOV BX,x1 CALL subab MOV SI,0 CMP SI,AX JE zhixian JMP lopxzhixian: JMP zhixianxs lopx: MOV x2x1,AX MOV AX,xmin MOV x,AX line0x: SUB AX,xmin MOV DX,0 MOV CX,y2y1 MUL CX MOV CX,x2x1 DIV CX MOV DX,0 CMP DL,s JE zhengx MOV CX,AX MOV AX,xminy SUB AX,CX JMP kk2xzhengx: ADD AX,xminykk2x: MOV y,AX CALL DIan
INC x MOV AX,x CMP AX,xmax JBE line0x JMP quit12 zhixianxs: MOV AX,xmin MOV x,AX MOV AX,ymin MOV y,AXlopxx: CALL DIan
INC y MOV AX,ymax CMP AX,y JAE lopxx quit12: MOV s,0 POPa POP y2 POP y1 POP x2 POP x1 RETlinex ENDP ;**************************liney x=(x2-x1)(y-y1)/(y2-y1)+x1 ;*****************y++ sjx PROC NEAR PUSH x1 PUSH x2 PUSH y1 PUSH y2 pusha CALL xymaxmin MOV AX,y2 MOV BX,y1 CALL subab MOV y2y1,AX MOV SI,0 CMP SI,AX JE to_sjxxsjx_lop1: MOV AX,x2 MOV BX,x1 CALL subab MOV x2x1,AX MOV SI,0 CMP SI,AX JE to_sjxy MOV DX,0 MOV AX,y2y1 MOV CX,x2x1 DIV CX CMP AX,1 JE to_sjxx CMP AX,0 JE to_sjxx JMP to_sjxyto_sjxx: MOV s,0 CALL sjxx JMP sjx_quitto_sjxy: MOV s,0 CALL sjxy sjx_quit: POPa POP y2 POP y1 POP x2 POP x1 MOV s,0 RETsjx ENDP
liney PROC NEAR PUSH x1 PUSH x2 PUSH y1 PUSH y2 pusha CALL xymaxmin MOV AX,y2 MOV BX,y1 CALL subab MOV y2y1,AX MOV SI,0 CMP SI,AX JE heng JMP lop1 heng: JMP hengxian lop1: MOV AX,x2 MOV BX,x1 CALL subab MOV x2x1,AX MOV AX,ymin MOV y,AX line0y: SUB AX,ymin MOV DX,0 MOV CX,x2x1 MUL CX MOV CX,y2y1 DIV CX MOV DX,0 CMP DL,s JE zhengy MOV CX,AX MOV AX,yminx SUB AX,CX JMP kkyzhengy: ADD AX,yminx kky: MOV x,AX CALL DIan INC y MOV AX,y CMP AX,ymax JBE line0y JMP quityhengxian: MOV AX,ymin MOV y,AX MOV AX,xmin MOV x,AXlopy: CALL DIan INC x MOV AX,xmax CMP AX,x JAE lopy
quity: MOV s,0 POPa POP y2 POP y1 POP x2 POP x1 RETliney ENDP ;***************************linex***y=(y2-y1)*(x-x1)/(x2-x1)+y1;****in (x1,y1),(x2,y2)******************x++ sjxx PROC NEAR pusha PUSH x1 PUSH x2 PUSH x3 PUSH y1 PUSH y2 PUSH y3 CALL xymaxmin MOV AX,xmin MOV sjx_xmin,AX MOV AX,ymin MOV sjx_ymin,AX MOV AX,xmax MOV sjx_xmax,AX MOV AX,ymax MOV sjx_ymax,AX MOV AX,xminy MOV sjx_xminy,AX MOV AX,y2 MOV BX,y1 CALL subab MOV sjx_y2y1,AX MOV AX,x2 MOV BX,x1 CALL subab MOV DL,s MOV s2,DL MOV s,0 MOV SI,0 CMP SI,AX JE sjx_zhixian JMP sjx_lopxsjx_zhixian: MOV x1,AX MOV AX,x3 MOV x2,AX MOV AX,y3 MOV y2,AX JMP sjx_zhixianxs sjx_lopx: MOV sjx_x2x1,AX MOV AX,x3 MOV x2,AX MOV AX,y3 MOV y2,AX MOV AX,sjx_xmin MOV x1,AX sjx_line0x: SUB AX,sjx_xmin MOV DX,0 ;***y=(y2-y1)*(x-x1)/(x2-x1)+y1 MOV CX,sjx_y2y1 MUL CX MOV CX,sjx_x2x1 DIV CX MOV DX,0 CMP DL,s2 JE sjx_zhengx MOV CX,AX MOV AX,sjx_xminy SUB AX,CX JMP sjx_kk2sjx_zhengx: ADD AX,sjx_xminysjx_kk2: MOV y1,AX CALL linex CALL liney INC x1 MOV AX,x1 CMP AX,sjx_xmax JBE sjx_line0x JMP sjx_quit12 sjx_zhixianxs: MOV AX,sjx_xmin MOV x1,AX MOV AX,sjx_ymin MOV y1,AXsjx_lopxx: CALL linex CALL liney INC y1 MOV AX,sjx_ymax CMP AX,y1 JAE sjx_lopxx sjx_quit12: MOV s,0 POP y3 POP y2 POP y1 POP x3 POP x2 POP x1 POPa RETsjxx ENDP ;**************************liney x=(x2-x1)(y-y1)/(y2-y1)+x1 ;*****************y++ sjxy PROC NEAR PUSH x1 PUSH x2 PUSH x3 PUSH y1 PUSH y2 PUSH y3 pusha CALL xymaxmin MOV AX,xmin MOV sjx_xmin,AX MOV AX,ymin MOV sjx_ymin,AX MOV AX,xmax MOV sjx_xmax,AX MOV AX,ymax MOV sjx_ymax,AX MOV AX,yminx MOV sjx_yminx,AX MOV AX,y2 MOV BX,y1 CALL subab MOV sjx_y2y1,AX MOV SI,0 CMP SI,AX JE sjxy_heng JMP sjxy_lop1 sjxy_heng: MOV DL,s MOV s2,DL MOV s,0 MOV AX,x3 MOV x2,AX MOV AX,y3 MOV y2,AX JMP sjxy_hengxian sjxy_lop1: MOV AX,x2 MOV BX,x1 ;x=(x2-x1)(y-y1)/(y2-y1)+x1 CALL subab MOV DL,s MOV s2,DL MOV s,0 MOV sjx_x2x1,AX MOV AX,x3 MOV x2,AX MOV AX,y3 MOV y2,AX MOV AX,sjx_ymin MOV y1,AX sjxy_line0y: SUB AX,sjx_ymin MOV DX,0 MOV CX,sjx_x2x1 MUL CX MOV CX,sjx_y2y1 DIV CX MOV DX,0 CMP DL,s2 JE sjxy_zhengy MOV CX,AX MOV AX,sjx_yminx SUB AX,CX JMP sjxy_kky3sjxy_zhengy: ADD AX,sjx_yminxsjxy_kky3: MOV x1,AX CALL linex CALL liney INC y1 MOV AX,y1 CMP AX,sjx_ymax JBE sjxy_line0y JMP sjxy_quitysjxy_hengxian: MOV AX,sjx_ymin MOV y1,AX MOV AX,sjx_xmin MOV x1,AXsjxy_lopy: CALL liney CALL linex INC x1 MOV AX,sjx_xmax CMP AX,x1 JAE sjxy_lopy
sjxy_quity: MOV s,0 POPa POP y3 POP y2 POP y1 POP x3 POP x2 POP x1 RETsjxy ENDP ; xymaxmin PROC NEAR PUSHa PUSH x1 PUSH x2 PUSH y1 PUSH y2 MOV AX,x1 CMP AX,x2 JAE x1dyx2 MOV xmin,AX ;x1
CLear PROC MOV DX,0410h CALL b1002 MOV CX,6000 MOV BH,PAGE1 MOV AL,' ' MOV AH,0ah INT 10h RETCLear ENDP
; 12根****************************** skin2 PROC PUSHa MOV AL,color6 MOV color,AL MOV CX,12 MOV AX,0skin2_kk1: PUSH CX PUSH AX MOV BX,r0 MOV CX,y0 MOV DX,x0 CALL enovate MOV AX,x MOV x1,AX MOV AX,y MOV y1,AX POP AX PUSH AX MOV BX,r0 ADD BX,10 MOV CX,y0 MOV DX,x0
CALL enovate MOV AX,x MOV x2,AX MOV AX,y MOV y2,AX CALL linex CALL liney POP AX ADD AX,30 POP CX LOOP skin2_kk1 MOV CX,4 MOV AX,0skin2_kk2: PUSH CX PUSH AX MOV BX,r0 MOV CX,y0 MOV DX,x0 CALL enovate MOV AX,x MOV x1,AX MOV AX,y MOV y1,AX POP AX PUSH AX MOV BX,r0 ADD BX,20 MOV CX,y0 MOV DX,x0
CALL enovate MOV AX,x MOV x2,AX MOV AX,y MOV y2,AX CALL linex CALL liney POP AX ADD AX,90 POP CX LOOP skin2_kk2 POPa RETskin2 ENDP ;60根**********************************88 skin3 PROC PUSHa MOV AL,color5 MOV color,AL MOV CX,60 MOV AX,0skin2_kk3: PUSH CX PUSH AX MOV BX,r0 MOV CX,y0 MOV DX,x0 CALL enovate MOV AX,x MOV x1,AX MOV AX,y MOV y1,AX POP AX PUSH AX MOV BX,r0 ADD BX,3 MOV CX,y0 MOV DX,x0
CALL enovate MOV AX,x MOV x2,AX MOV AX,y MOV y2,AX CALL linex CALL liney POP AX ADD AX,6 POP CX LOOP skin2_kk3 POPa RETskin3 ENDP ;数字加圆**************************************88 skin PROC NEAR MOV AL,color4 MOV color,AL MOV BX,r0 CALL yuan MOV BX,r0 MOV DH,7 MOV DL,39 CALL b1002 MOV DL,'1' MOV AH,2 INT 21h MOV DH,7 MOV DL,40 CALL b1002 MOV DL,'2' MOV AH,2 INT 21h MOV DH,8 MOV DL,47 CALL b1002 MOV DL,'1' MOV AH,2 INT 21h MOV DH,11 MOV DL,53 CALL b1002 MOV DL,'2' MOV AH,2 INT 21h MOV DH,19 MOV DL,53 CALL b1002 MOV DL,'4' MOV AH,2 INT 21h
MOV DH,22 MOV DL,47 CALL b1002 MOV DL,'5' MOV AH,2 INT 21h
MOV DH,22 MOV DL,32 CALL b1002 MOV DL,'7' MOV AH,2 INT 21h MOV DH,19 MOV DL,26 CALL b1002 MOV DL,'8' MOV AH,2 INT 21h MOV DH,11 MOV DL,25 CALL b1002 MOV DL,'1' MOV AH,2 INT 21h MOV DH,11 MOV DL,26 CALL b1002 MOV DL,'0' MOV AH,2 INT 21h
MOV DH,8 MOV DL,30 CALL b1002 MOV DL,'1' MOV AH,2 INT 21h MOV DH,8 MOV DL,31 CALL b1002 MOV DL,'1' MOV AH,2 INT 21h MOV DH,15 MOV DL,55 CALL b1002 MOV DL,'3' MOV AH,2 INT 21h MOV DH,23 MOV DL,40 CALL b1002 MOV DL,'6' MOV AH,2 INT 21h MOV DH,15 MOV DL,24 CALL b1002 MOV DL,'9' MOV AH,2 INT 21h RET skin ENDP msg PROC NEAR ;in bp为输出字符串地址 PUSH ES PUSH DS POP ES MOV CX,40h MOV AL,0 MOV BX,2 MOV AH,13h INT 10h POP ES RETmsg ENDP
;*****************in dl out albcd2 PROC NEAR MOV AH,0 MOV AL,DL SHR AL,4 AND AL,0fh MOV CL,10 MUL CL MOV CL,AL MOV AL,DL AND AL,0fh ADD AL,CL;;;;; bcd转16进制 RETbcd2 ENDP ;r0=bx 圆心cx 行 dx列******************** yuan PROC PUSHa MOV CX,360 MOV AX,0yuan_kk1: PUSH CX PUSH AX MOV CX,y0 MOV DX,x0 CALL enovate CALL dian POP AX ADD AX,1 POP CX LOOP yuan_kk1 POPa RETyuan ENDP ;*****************in ax度数 bx=半径r长度,cx 列 dx行 圆心 out x,y************enovate PROC NEAR PUSHa PUSH DX PUSH AX PUSH CX CALL SInlwfree.cn ADD AX,CX JMP enovate_kk1ian: SUB CX,AX MOV AX,CXenovate_kk1: MOV y,AX POP AX CALL cos MOV DX,0 MOV CX,BX DIV CX POP DX CMP SI,1 JE ian2 ADD AX,DX JMP enovate_kk2ian2: MOV CX,DX SUB CX,AX MOV AX,CXenovate_kk2: MOV x,AX POPa RETenovate ENDP MAIN ENDP ;------------------------------------------------------CODE_SEG ENDS;****************************************************** END START ;程序结束
时钟显示程序-微型计算机技术
报时小闹钟 本程序是一个用汇编编的精致的图形时钟,运行时双击clock图标即可,钟表显示的时间为本机系统的时间。 按b键可扩大画面 ;按s键可缩小画面;按c键可改变颜色;按e键可听音乐;按q键退出本程序. PUBLIC GENSOUNDCODE SEGMENT PARA 'CODE' ASSUME CS: CODEGENSOUND PROC FAR PUSH AX PUSH BX PUSH CX PUSH DX PUSH DI MOV AL, 0B6H OUT 43H, AL MOV DX, 12Hlwfree.cn IN AL, 61H OR AL, 3 OUT 61H, ALWAIT1: MOV CX, 8FF0HDELAY: LOOP DELAY DEC BX JNZ WAIT1 MOV AL, AH OUT 61H, AL POP DI POP DX POP CX POP BX POP AX RETGENSOUND ENDPCODE ENDS END EXTRN GENSOUND:FARPUBLIC MUSICSTACK SEGMENT PARA STACK 'STACK' DB 64 DUP ('STACK')STACK ENDSDATA SEGMENT PARA 'DATA'MUS_FREQ DW 330, 294, 262, 294, 3 DUP (330) DW 3 DUP (294), 330,392,392 DW 330, 294, 262, 294, 4 DUP (330) DW 293, 294, 330, 294, 262,-1MUS_TIME DW 6 DUP (25*8), 50*8 DW 2 DUP (25*8, 25*8, 50*8) DW 12 DUP (25*8), 100*8DATA ENDSCODE SEGMENT PARA 'CODE' ASSUME CS: CODE, SS: STACK ASSUME DS: DATAMUSIC PROC FAR PUSH DS PUSH DX PUSH CX PUSH BX PUSH AX MOV AX, DATA MOV DS, AX LEA SI, MUS_FREQ LEA BP, DS: MUS_TIMEFREQ: MOV DI, [SI] CMP DI, -1 JE END_MUS MOV BX, DS: [BP] CALL GENSOUND ADD SI, 2 ADD BP, 2 JMP FREQEND_MUS: POP AX POP BX POP CX POP DX POP DS RETMUSIC ENDPCODE ENDS END
时钟显示程序-微型计算机技术cursor equ 45Hattrib equ 2fhcode segment assume cs:code,ds:codestart: jmp gooldcur dw ?OLD1C DW 2 DUP(?)NEWINT1C: PUSHF CALL DWORD PTR CS:OLD1C push ax PUSH BX PUSH CX PUSH DX XOR BH,BH MOV AH,3 INT 10H MOV CS:OLDCUR,DX MOV AH,2 xor bh,bh MOV DX,CURSOR INT 10H MOV AH,2 INT 1AH PUSH DX PUSH CX POP BX PUSH BX CALL SHOWBYTE CALL SHOWCOLON POP BX XCHG BH,BL CALL SHOWBYTE CALL SHOWCOLON POP BX CALL SHOWBYTE MOV DX,CS:OLDCUR MOV AH,2 XOR BH,BH INT 10H POP DX POP CX POP BX POP AX IRETSHOWBYTE PROC NEAR PUSH BX MOV CL,4 MOV AL,BH SHR AL,CL ADD AL,30H CALL SHOW CALL CURMOVE POP BX MOV AL,BH AND AL,0FH ADD AL,30H CALL SHOW CALL CURMOVE RETSHOWBYTE ENDP
SHOWCOLON PROC NEAR MOV AL,':' CALL SHOW CALL CURMOVE RETSHOWCOLON ENDP
CURMOVE PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX MOV AH,3 MOV BH,0 INT 10H INC DL MOV AH,2 INT 10H POP DX POP CX POP BX POP AX RETCURMOVE ENDP这是一个显示系统时间的程序,运行时,在屏幕的右上角将以“时:分:秒”的形式显示本机系统的时间。该程序只能在DOS下运行。
SHOW PROC NEAR PUSH AX PUSH BX PUSH CX MOV AH,09H MOV BX,attrib MOV CX,1 INT 10H POP CX POP BX POP AX RETSHOW ENDP
GO: PUSH CS POP DS MOV AX,351CH INT 21H MOV OLD1C,BX MOV BX,ES MOV OLD1C+2,BX MOV DX,OFFSET NEWINT1C MOV AX,251CH INT 21H MOV DX,OFFSET GO SUB DX,OFFSET START MOV CL,4 SHR DX,CL ADD DX,11H MOV AX,3100H INT 21HCODE ENDS END START
时钟显示程序-微型计算机技术汇编语言实践操作指导汇编语言源程序的编辑、汇编、连接的方法,DEBUG调试命令及其使用方法 一、编辑源程序 汇编语言源程序:用汇编语句编写的解决应用问题的程序。汇编程序:将汇编语言源程序翻译成机器语言程序的系统。汇编:将汇编语言程序翻译成机器语言程序的过程。在编辑汇编语言源程序时,对计算机硬件工作环境无特殊要求,对软件工作环境要求也很简单,只需用建立ASCII码文本文件的软件即可。(1)编辑软件全屏编辑软件:EDIT.COM、WINDOWS 记事本等当输入、建立和修改源程序时,可任选一种编辑软件,不要用格式控制符,要求编辑完成的文件扩展名一定是.ASM。(2)汇编程序有汇编ASM.EXE、宏汇编MASM.EXE及TASM等,一般使用宏汇编MASM.EXE,因它比ASM.EXE功能强。TASM适用于8086/8088~Pentium系列指令系统所编写的汇编语言程序,是比较先进的汇编工具。(3)连接程序用连接程序LINK.EXE或TLINK.EXE,将MASM.EXE产生的机器代码程序(.OBJ)文件连接成可执行程序.EXE,TLINK比LINK更先进。(4)辅助工具程序(.EXE)进行汇编语言程序调试和文件格式转换的程序有: DEBUG.COM 动态调试程序 EXE2BIN.EXE 文件格式转换程序 CREF.EXE 交叉引用程序编辑、汇编、连接、调试过程如图1.1所示。 二、 汇编源程序 用编辑软件建立的源程序.ASM文件,必须经过汇编才能产生.OBJ文件。为此,需键入: C:>MASM <源文件名> 或 C:>MASM按前一种格式键入,屏幕上显示: Microsoft(R) Macro assemble Version 5.00 Copyright(C) Microsoft Corp 1981-1985,1987 ALL rights reserved OBJ filename[.obj]: Source listing[nul.lst]: Cross-reference[nul.crf]:以上信息中方括中为该项提示的缺省回答值,冒号后面等待用户输入信息,若不改变缺省值则直接按回车键。汇编后生成以下几个文件:(1).OBJ文件.OBJ文件是必须生成的一个目标代码文件,当源程序中无语法错误时,则在当前工作盘上自动存入一个.OBJ文件,供下一步连接用。若源程序有语法错误时,会出现错误信息提示: 源程序文件行 错误信息代码 错误说明信息最后信息提示: ×× Warning errors (警告错误) ×× Severe errors (严重错误)若严重错误总数不为0,则.OBJ文件没有生成,需回到编辑状态下修改源程序直到无错为止。(2).LST文件(列表文件).LST文件对调试程序有帮助,它是将源程序中各语句及其对应的目标代码和符号表以清单方式列出,如果需要,在屏幕显示的第二个提问的冒号后输入文件名即可,如果不需要,直接按回车键。(3).CRF文件(交叉引用文件)交叉引用.CRF文件给出了源程序中定义的符号引用情况,按字母顺序排列。.CRF文件不可显示,须用CREF.EXE系统程序将.CRF文件转换成为.REF文件后方可显示输出。若按后一种格式输入,系统会依次出现四个提示信息,比第一种格式多了一项源程序文件名的输入。应答方式与第一种格式相同。三、 连接目标程序 汇编后生成的.OBJ文件,其所有目标代码的地址都是浮动的偏移地址,机器不能直接运行。必须用连接程序(LINK.EXE)对其进行连接装配定位,产生.EXE可执行文件,方可运行。在系统提示符下键入:LINK <源程序文件名> 或 LINK屏幕上出现以下提示信息: Microsoft(R) Macro assemble Version 5.00 Copyright(C) Microsoft Corp 1981-1985,1987 ALL rights reserved Run file [.EXE]: List File [nul.map]: Libraries [.lib]:连接后,可生成两种文件:.EXE和.MAP(1).EXE文件(可执行文件)若采用方括号中的默认值,直接按回车键,否则需重新输入一文件名。若连接过程中无错误,则自动在当前工作盘生成.EXE文件。若有错误,则会给出错误信息提示,这时必须重新修改源程序,再汇编、连接。(2).MAP(连接映像文件)(3).LIB库文件连接程序询问是否使用某种库文件,不需使用库文件直接按回车键。(4)若要连接多个模块目标程序,可用“+”把它们连接起来。 如:LINK files1+files2+files3若直接键入:LINK会依次出现四个提示信息,应答方式应与LINK<源程序文件>相同,仅增加了一项输出,询问被连接的目标文件名字:Object Modeules[.OBJ]:格式:LINK ;多了一个分号,表示结束后续询问。四、 运行程序 经过汇编、连接后生成的.EXE文件,可在DOS系统直接运行,只要键入相应的文件名即可。如:C:\MASM><文件名>DOS的COMMAND.COM模块将该程序装配到内存,并设置和分配启动地址。也可在DEBUG调试程序下运行。如何用DEBUG程序来运行和调试程序将在DEBUG调试程序中详细讨论。五、 DEBUG调试程序 DEBUG.EXE程序是专门为分析、研制和开发汇编语言程序而设计的一种调试工具,具有跟踪程序执行、观察中间运行结果、显示和修改寄存器或存储单元内容等多种功能。它能使程序设计人员或用户触及到机器内部,因此可以说它是80X86CPU的心灵窗口,也是我们学习汇编语言必须掌握的调试工具。 1)DEBUG程序使用在DOS提示符下键入命令: C>DEBUG [盘符:][路径][文件名.EXE][参数1][参数2] 这时屏幕上出现DEBUG的提示符“-”,表示系统在DEBUG管理之下,此时可以用DEBUG进行程序调试。若所有选项省略,仅把DEBUG装入内存,可对当前内存中的内容进行调试,或者再用N和L命令,从指定盘上装入要调试的程序;若命令行中有文件名,则DOS把DEBUG程序调入内存后,再由DEBUG将指定的文件名装入内存。2)DEBUG的常用命令(1)汇编命令 A格式:A[起始地址]功能:将输入源程序的指令汇编成目标代码并从指定地址单元开始存放。若缺省起始地址,则从当前CS:100地址开始存放。A命令按行汇编,主要是用于小段程序的汇编或对目标程序的修改。 (2)反汇编命令 U 格式1:U[起始地址] 格式2:U[起始地址][结束地址|字节数] 功能:格式1从指定起始地址处开始将32个字节的目标代码转换成汇编指令形式,缺省起始地址,则从当前地址CS:IP开始。 格式2将指定范围的内存单元中的目标代码转换成汇编指令。(3)显示、修改寄存器命令 R格式:R[寄存器名]功能:若给出寄存器名,则显示该寄存器的内容并可进行修改。缺省寄存器名,则按以下格式显示所有寄存器的内容及当前值(不能修改)。 AX=0000 BX=0004 CX=0020 DX=0000 SP=0080 BP=0000 SI=0000 DI=0000 DS=3000 ES=23A0 CS=138E IP=0000 NV UP DI PL NZ NA PO NC 138E:0000 MOV AX,1234 -R AX ;输入命令 AX 0014 ;显示AX的内容 : ;供修改,不修改按回车。
若对标志寄存器进行修改,输入:-RF 屏幕显示如下信息,分别表示OF、DF、IF、SF、ZF、AF、PF、CF的状态。
时钟显示程序-微型计算机技术NV UP DI PL NZ NA PO NC不修改按回车键。要修改需个别输入一个或多个此标志的相反值,再按回车键。R命令只能显示、修改16位寄存器。(4)显示存储单元命令 D格式1:D[起始地址] 格式2:D[起始地址][结束地址|字节数] 功能:格式1从起始地址开始按十六进制显示80H个单元的内容,每行16个单元,共8行,每行右边显示16个单元的ASCII码,不可显示的ASCII码则显示“•”。格式2显示指定范围内存储单元的内容,其他显示方式与格式1一样。如果缺省起始地址或地址范围,则从当前的地址开始按格式1显示。例如: -D 200 ;表示从DS:0200H开始显示128个单元内容 -D 100 120 ;表示显示DS:0100-DS:0120单元的内容 说明:在DEBUG中,地址表示方式有如下形式: 段寄存器名:相对地址,如:DS:100段基值:偏移地址(相对地址),如:23A0:1500(5)修改存储单元命令 E格式1:E[起始地址] [内容表] 格式2:E[地址] 功能:格式1按内容表的内容修改从起始地址开始的多个存储单元内容,即用内容表指定的内容来代替存储单元当前内容。 例如:—E DS:0100 'VAR' 12 34 表示从DS:0100 为起始单元的连续五个字节单元内容依次被修改为 'V'、'A'、'R'、12H、34H。格式2是逐个修改指定地址单元的当前内容。 如:—E DS:0010 156F:0010 41.5F其中156F:0010单元原来的值是41H,5FH为输入的修改值。若只修改一个单元的内容,这时按回车键即可;若还想继续修改下一个单元内容,此时应按空格键,就显示下一个单元的内容,需修改就键入新的内容,不修改再按空格跳过,如此重复直到修改完毕,按回车键返回DEBUG“-”提示符。如果在修改过程中,将空格键换成按“-”键,则表示可以修改前一个单元的内容。(6)运行命令 G格式:G[=起始地址][第一断点地址[第二断点地址……]]功能:CPU从指定起始地址开始执行,依次在第一、第二等断点处中断。若缺省起始地址,则从当前CS:IP指示地址开始执行一条指令。最多可设置10个断点。(7)跟踪命令 T格式:T[起始地址][正整数]功能:从指定地址开始执行‘正整数’条指令,若缺省‘正整数’,表示执行一条指令,若两项都缺省,表示从当前CS:IP指示地址开始执行一条指令。(8)指定文件命令 N 格式:N<文件名或扩展名>功能:指定即将调入内存或从内存写入磁盘的文件名。该命令应该用在L命令和W命令之前。(9)装入命令 L 格式1:L[起始地址][盘符号][扇区号][扇区数] 格式2:L[起始地址] 功能:格式1根据盘符号,将指定扇区的内容装入到指定起始地址的存储区中。格式2将N命令指出的文件装入到指定起始地址的存储区中,若省略起始地址,则装入到CS:100处或按原来文件定位约定装入到相应位置。(10)写磁盘命令 W格式1:W<起始地址>[驱动器号]<起始扇区><扇区数>格式2:W[起始地址] 功能:格式1把指定地址开始的内容数据写到磁盘上指定的扇区中。格式2将起始地址的BX×10000H+CX个字节内容存放到由N命令指定的文件中。在格式2的W命令之前,除用N命令指定存盘的文件名外,还必须将要写的字节数用R命令送入BX和CX中。(11)退出命令 Q 格式:Q 功能:退出DEBUG,返回到操作系统。以上介绍的是DEBUG常用命令,其他命令请参考有关书籍。 内容及步骤:DEBUG 命令使用:1、打 DEBUG 进入 DEBUG 控制,显示提示苻 '_ '。2、用命令 F100 10F 'A' 将'A'的ASCII码填入内存。3、用命令 D100 10F 观察内存中的16进制码及屏幕右边的ASCII字符。4、用命令 F110 11F 41 重复上二项实验,观察结果并比较。5、用命令 E100 30 31 32 …… 3F将30H-3FH写入地址为100开始的内存单元中,再用D命令观察结果,看键入的16进制数是什么字符的ASCII码?6、用R 命令检查各寄存器内容,特别注意AX,BX,CX,DX,IP及标志位中ZF,CF和AF的内容。8、用R命令将AX,BX内容改写为1050H及23A8H。8088常用指令练习1、传送指令1)用A命令在内存100H处键入下列内容:MOV AX,1234MOV BX,5678XCHG AX,BXMOV AH,35MOV AL,48MOV DX,75ABXCHG AX,DX2)用U命令检查键入的程序并记录,特别注意左边的机器码。3)用T命令逐条运行这些指令,每运行一行检查并记录有关寄存器及IP的变化情况。并注意标志位有无变化。2、加减法指令:1)用A命令在内存100H处键入下列内容:MOV AH,34MOV AL,22ADD AL,AHSUB AL,78MOV CX,1284MOV DX,5678ADD CX,DXSUB CX,AXSUB CX,CX2)用U命令检查键入的程序及对应的机器码。3)用T命令逐条运行这些指令,检查并记录有关寄存器及ZF情况。思考:这次运行还是打入T,行不行?怎么办?用R命令检查一下IP的内容。注意T命令与IP的关系。3、带进位加减法:1)用A命令在内存200H处键入下列内容,并用U命令检查:MOV AH,12MOV AL,84MOV CH,56MOV CL,78ADD AL,CLADC AH,CHMOV DH,A7MOV DL,58SUB DL,7FSBB DH,342)用T命令逐条运行这些指令,检查并记录有寄存器及CF内容。3)上面这段程序若改用16位操作指令达到同样结果,怎么改?试修改并运 行之。4、BCD码加减法1)内容:MOV AL,58ADD AL,25DAA2)要求:用A 命令键入,U命令检查,T命令逐条运行并记录有关寄存器及AF内容。附:DEBUG 使用:1、打 DEBUG 进入 DEBUG,显示提示苻 '_ '。2、退出DEBUG命令:Q3、显示内存命令:D 起始地址 结束地址4、修改内存命令:E 起始地址,连续修改打空格键。打回车键退出E命令。5、检查寄存器命令:R标志位显示 1 0CF CY NCZF ZR NZSF NG PLAF AC NAOF OV NVPF PE PODF DN UPIF EI DI6、修改寄存器命令:R 寄存器名7、小汇编命令:A 起始地址,不输入指令打回车键退出A命令。8、反汇编命令:U 起始地址 结束地址9、文件命名命令:N 盘号:文件名10、读文件命令:L 内存地址11、写文件命令:W 内存地址10、读扇区命令:L 内存地址 盘号(0--A:,1--B:) 扇区号 扇区数11、写扇区命令:W 内存地址 盘号 扇区号 扇区数12、运行命令:G=起始地址 结束(断点)地址13、单步命令:T=起始地址 运行指令数,进入子程序内部。14、单步命令:P=起始地址 运行指令数,不进入子程序内部。15、内存搬家命令:M 起始地址 结束地址 目的地址