1、实验一 汇编语言程序设计实验一 汇编语言程序设计实验一汇编语言程序设计一、实验目的1、掌握Lab6000p实验教学系统基本操作;2、掌握8088/8086汇编语言的基本语法结构;3、熟悉8088/8086汇编语言程序设计基本方法 二、实验设备装有emu8086软件的PC机 三、实验内容1、有一个10字节的数组,其值分别是80H,03H,5AH,FFH,97H,64H,BBH,7FH,0FH,D8H。编程并显示结果:如果数组是无符号数,求出最大值,并显示; 如果数组是有符号数,求出最大值,并显示。2、将二进制数500H转换成二十进制码,并显示“500H的BCD是:” 3、将二十进制码7693转换
2、成ASCII码,并显示“BCD码7693的ASCII是:” 4、两个长度均为100的内存块,先将内存块1全部写上88H,再将内存块1的内容移至内存块2。在移动的过程中,显示移动次数1, 2 ,30AH64H5、键盘输入一个小写字母(az),转换成大写字母 显示:请输入一个小写字母(az): 转换后的大写字母是:6、实现4字节无符号数加法程序,并显示结果,如99223344H + 99223344H = xxxxxxxxH 四、实验代码及结果 、实验代码:第1页DATA SEGMENT SZ DB 80H,03H,5AH,0FFH,97H,64H,0BBH,7FH,0FH,0D8H;存进数组SH
3、OW DB THE MAX IS: ,$ DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOVAX,DATA;把数据的基地址赋给DSMOVDS,AX MOVDX,OFFSET SHOW;调用DOS显示字符串MOVAH,09H INT21H MOVSI ,OFFSET SZ;数组的偏移地址赋给SIMOVCX,10 ;存进数组的长度给CXMOVDH,80H;将数组的第一个数写进DH NEXT: MOVBL,SI;将数组的第一个数写进BLCMPDH,BL ;比较DH和BL中数的到校JAENEXT1;如果DH中的数大于BL中,将跳转到NEXT
4、1MOVDH,BL ;如果DH中的数小于BL中,将BL中的数赋给DH NEXT1: INCSI;偏移地址加1 LOOPNEXT;循环,CX自减一直到0,DH中存数组的最大值;接下来的程序是将将最大值DH在屏幕上显示输出MOVBX,02H第 2 页NEXT2: MOVCL,4 ROLDH,CL;将DH循环右移四位MOVAL,DH ANDAL,0FH;将AL高位清零,一位一位进行ASCII码转换CMPAL,09H;与09H比较大小 JBENEXT3;若小于,跳转至NEXT3,证明数值在0-9之间 ADDAL,07H ;若大于,则证明为字母,因为字母与数字的ASCII码相差7,所以要加上7 NEXT
5、3: ADDAL,30H ;因为转换为ASCII码要加30HMOVDL,AL MOVAH,2;DOS中断显示INT21HDECBXJNZNEXT2MOVDL,HMOVAH,2INT21H CODE ENDSEND START 实验结果:第 3 页第 4 页、实验代码 DATA SEGMENT SZ DB 80H,03H,5AH,0FFH,97H,64H,0BBH,7FH,0FH,0D8H;存进数组SHOW DB THE MAX IS: ,$ DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOVAX,DATA;把数据的基地址赋给DSMO
6、VDS,AX MOVDX,OFFSET SHOW;调用DOS显示字符串MOVAH,09H INT21H MOVSI ,OFFSET SZ;数组的偏移地址赋给SIMOVCX,10 ;存进数组的长度给CXMOVDH,80H;将数组的第一个数写进DH NEXT: MOVBL,SI;将数组的第一个数写进BLCMPDH,BL ;比较DH和BL中数的到校 JGENEXT1;如果DH中的数大于BL中,将跳转到NEXT1;此为无符号数与有符号数的唯一差别,JGE是无符号数的跳转MOVDH,BL;如果DH中的数小于BL中,将BL中的数赋给DH NEXT1: INCSI;偏移地址加1 LOOPNEXT ;循环,C
7、X减1,一直到CX减为0,DH中存数组的最大值第 5 页 ;接下来的程序是将最大值DH在屏幕上显示输出MOVBX,02H NEXT2: MOVCL,4 ROLDH,CL;将DH循环右移四位MOVAL,DH ANDAL,0FH ;将AL高位清零,一位一位进行ASCII码转换CMPAL,09H;与09H比较大小 JBENEXT3 ;若小于,跳转至NEXT3,证明数值在0-9之间 ADDAL,07H;若大于,则证明为字母,因为字母与数字的ASCII码相差7,所以要加上7 NEXT3: ADDAL,30H;因为转换为ASCII码要加30HMOVDL,AL MOVAH,2;DOS中断显示INT21HDE
8、CBXJNZNEXT2MOVDL,HMOVAH,2INT21H CODE ENDSEND START 实验结果第 6 页第 7 页2、实验代码DATASEGMENTBNUM DW 0500HDNUM DB 4 DUP MES DB THE BCD OF 500H IS: ,$ DATAENDS CODESEGMENTASSUME CS:CODE,DS:DATA START:MOVAX,DATAMOVDS,AXMOVDX,OFFSET MESMOVAH,09HINT21HMOVAX,BNUMLEABX,DNUMMOVDL,0 ;计算1000的个数 COUNT1:SUBAX,03E8HJCNEXT
9、1INCDLJMPCOUNT1NEXT1:ADDAX,03E8H;将字符串偏移量写入DX;将0500H存入AX中;取DNUM的偏移量;AX-1000;不够减,即若CF=1,有借位,转NEXT1;DL+1;跳转AGAIN1;AX+1000第 8 页MOVBX,DL;将DL(即千位数)存入DNUM中INCBX;BX+1MOVDL,0;DL清零 ;计算100个数 COUNT2:SUB JCINCJMP NEXT2:ADD MOVINCMOV ;计算10个数 COUNT3:SUB JCINCJMP NEXT3:ADD MOVINCMOVAX,0064HNEXT2 DL COUNT2 AX,0064HB
10、X,DLBX DL,0 AX,000AHNEXT3 DL COUNT3 AX,000AHBX,DLBX BX,AL ;AX-100 ;将DL(即百位数)存入DNUM中 ;AX-10 ;将DL(十位数)存入DNUM中 ;计算个位数第 9 页;接下来的程序是将数值转化为ASCII并在屏幕上显示MOVCX,4LEASI,DNUM ;取DNUM的地址偏移量 NEXT4:MOVAL,SI ;将DNUM中所存的各个数值转换为ASCII码; ;在屏幕上输出显示CMPAL,09HJBENEXT5ADDAL,07HNEXT5:ADDAL,30H MOVDL,ALMOVAH,2INT21H INCSIDECCX
11、JNZNEXT4CODEENDSENDSTART 实验结果第 10 页第 11 页3、实验代码 DATA SEGMENTOUP DB THE ASCII OF 7963 IS:,$A1 DB 07H,09H,06H,03H DATA ENDS CODE SEGMENTASSUME CS:CODE,DS:DATA START:MOVAX,DATAMOVDS,AXMOVDX,OFFSET OUPMOVAH,09HINT21HMOVCL,4MOVSI,0 NEXT:MOVAL,A1SI ;将A1的第SI个数据传给ALMOVBL,ALORAL,30H;加30转换为ASCII码值SHRAL,4ANDAL
12、,0FH;将右移后的高位清零ADDAL,30H;因为ASCII码与值之间相差30MOVDL,ALMOVAH,2;输出对应的ASCII码INT21H第 12 页MOVAL,BLANDAL,0FHADDAL,30HMOVDL,ALMOVAH,02HINT21HMOVDL, MOVAH,02HINT21HINCSILOOPNEXT EXIT:MOVAH,4CHINT21H CODEENDSENDSTART 实验结果第 13 页第 14 页4、实验代码DATASEGMENTYI DB 100 DUP(88H)ER DB 100 DUP(00H);定义数组MES DB THE NUMBER OF COU
13、NTER IS: ,$ DATAENDS CODESEGMENTASSUME CS:CODE,DS:DATA MAINPROC FAR START:MOV AX,DATAMOV DS,AXMOV CL,100MOV CH,00HLEA SI,YILEA DI,ERNEXT:MOV AL,SIMOV DI,ALINC SIINC DIINC CHMOV DX,OFFSET MESMOV AH,9INT 21HCALL COUNTDEC CL;计数器初值;转移次数统计,初值 ;将内存块1的偏移量给SI ;将内存块2的偏移量给DI ;将YI中的数据复制到ER中;显示字符串;调用子程序 ;计数减1第
14、15 页JNZ NEXT;计数不为零,跳转执行HLTMAIN ENDP;主程序结束 ;下面是子程序,实现屏幕显示转移次数功能COUNTPROC NEAR;定义子程序属性NEXT2:NEXT3:PUSH CXMOV DH,CH MOV BX,02HMOV CL,4ROL DH,CLMOV AL,DHAND AL,0FHCMP AL,09HJBE NEXT3ADD AL,07HADD AL,30H MOV DL,ALMOV AH,2INT 21H DEC BX JNZ NEXT2MOV DL,HMOV AH,2 INT 21HMOV DL,0AH;CX进栈;将DH循环右移四位;将AL高位清零 ;与
15、09H比较大小 ;若小于,跳转至NEXT3 ;加30H ;DOS中断显示 ;显示H ;回车第 16 页MOV AH,2INT 21HMOV DL,0DH;换行MOV AH,2INT 21HPOP CX;CX出栈RET COUNTENDP ;子程序结束 CODEENDSEND START 实验结果第 17 页第 18 页5、实验代码DATASEGMENTINP DB PLEASE INPUT (az): ,$;设置字符串OUP DB THE TRANSFORMATION(AZ) IS:,$ DATAENDSCODESEGMENTASSUME CS:CODE,DS:DATA MAINPROC FA
16、R START:MOV AX,DATAMOV DS,AXMOV DX,OFFSET INP;显示字符串,提示输入MOV AH,9INT 21HMOV AH,1;DOS中断调用,从键盘中读取一个字符INT 21HPUSH AX;AX入栈PUSH DXMOV DL,0DH ;中断调用,回车MOV AH,2INT 21HMOV DL,0AH ;中断调用,换行MOV AH,2INT 21HMOV DX,OFFSET OUP;显示字符串,输出提示MOV AH,9第 19 页INT 21HPOP DX;DX出栈POP AX;AX出栈SUB AL,32 ;AL减去32,使大写转化为小写 ;大小写之间的ASC
17、II码值相差32MOV DL,AL;DOS中断显示结果MOV AH,2INT 21HMAIN ENDP CODEENDSEND START 实验结果:第 20 页实验一汇编语言程序设计一、实验目的1、掌握Lab6000p实验教学系统基本操作;2、掌握8088/8086汇编语言的基本语法结构;3、熟悉8088/8086汇编语言程序设计基本方法 二、实验设备装有emu8086软件的PC机 三、实验内容1、有一个10字节的数组,其值分别是80H,03H,5AH,FFH,97H,64H,BBH,7FH,0FH,D8H。编程并显示结果:如果数组是无符号数,求出最大值,并显示; 如果数组是有符号数,求出最
18、大值,并显示。2、将二进制数500H转换成二十进制码,并显示“500H的BCD是:” 3、将二十进制码7693转换成ASCII码,并显示“BCD码7693的ASCII是:” 4、两个长度均为100的内存块,先将内存块1全部写上88H,再将内存块1的内容移至内存块2。在移动的过程中,显示移动次数1, 2 ,30AH64H5、键盘输入一个小写字母(az),转换成大写字母 显示:请输入一个小写字母(az): 转换后的大写字母是:6、实现4字节无符号数加法程序,并显示结果,如99223344H + 99223344H = xxxxxxxxH 四、实验代码及结果 、实验代码:第1页DATA SEGMEN
19、T SZ DB 80H,03H,5AH,0FFH,97H,64H,0BBH,7FH,0FH,0D8H;存进数组SHOW DB THE MAX IS: ,$ DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOVAX,DATA;把数据的基地址赋给DSMOVDS,AX MOVDX,OFFSET SHOW;调用DOS显示字符串MOVAH,09H INT21H MOVSI ,OFFSET SZ;数组的偏移地址赋给SIMOVCX,10 ;存进数组的长度给CXMOVDH,80H;将数组的第一个数写进DH NEXT: MOVBL,SI;将数组的第一个
20、数写进BLCMPDH,BL ;比较DH和BL中数的到校JAENEXT1;如果DH中的数大于BL中,将跳转到NEXT1MOVDH,BL ;如果DH中的数小于BL中,将BL中的数赋给DH NEXT1: INCSI;偏移地址加1 LOOPNEXT;循环,CX自减一直到0,DH中存数组的最大值;接下来的程序是将将最大值DH在屏幕上显示输出MOVBX,02H第 2 页NEXT2: MOVCL,4 ROLDH,CL;将DH循环右移四位MOVAL,DH ANDAL,0FH;将AL高位清零,一位一位进行ASCII码转换CMPAL,09H;与09H比较大小 JBENEXT3;若小于,跳转至NEXT3,证明数值在
21、0-9之间 ADDAL,07H ;若大于,则证明为字母,因为字母与数字的ASCII码相差7,所以要加上7 NEXT3: ADDAL,30H ;因为转换为ASCII码要加30HMOVDL,AL MOVAH,2;DOS中断显示INT21HDECBXJNZNEXT2MOVDL,HMOVAH,2INT21H CODE ENDSEND START 实验结果:第 3 页第 4 页、实验代码 DATA SEGMENT SZ DB 80H,03H,5AH,0FFH,97H,64H,0BBH,7FH,0FH,0D8H;存进数组SHOW DB THE MAX IS: ,$ DATA ENDS CODE SEGME
22、NT ASSUME CS:CODE,DS:DATA START: MOVAX,DATA;把数据的基地址赋给DSMOVDS,AX MOVDX,OFFSET SHOW;调用DOS显示字符串MOVAH,09H INT21H MOVSI ,OFFSET SZ;数组的偏移地址赋给SIMOVCX,10 ;存进数组的长度给CXMOVDH,80H;将数组的第一个数写进DH NEXT: MOVBL,SI;将数组的第一个数写进BLCMPDH,BL ;比较DH和BL中数的到校 JGENEXT1;如果DH中的数大于BL中,将跳转到NEXT1;此为无符号数与有符号数的唯一差别,JGE是无符号数的跳转MOVDH,BL;如果DH中的数小于BL中,将BL中的数赋给DH NEXT1: INCSI;偏移地址加1 LOOPNEXT ;循环,CX减1,一直到CX减为0,DH中存数组的最大值第 5 页