1、河北工业大学汇编语言程序设计实验 汇编语言程序设计实验 网络*** *** 实验一 顺序与分支程序设计 一 、实验目的 1) 掌握顺序程序设计方法。 2) 掌握分支程序的结构与分支程序的设计,调试方法。 2) 学习数据传送与算术和逻辑运算指令的用法。 3) 熟悉在pc机上建立、汇编、连接、调试和运行汇编语言程序的过程。 二、实验内容 1.实验六 从键盘上接收一位十进制数x,计算y值,并以十六进制形式显示出来,y按下列公式计算。 2..实验七 实验内容:从键盘上接收两个一位十六进制数x和y,然后再输入一个a-d之间的一个字符,按下列要求计算。
2、a) 当输入字符为a,则计算x+y,并以十六进 制形式显示出来 b) 当输入字符为b,则计算|x-y|,并以十六进制形式显示出来 c) 当输入字符为c,则计算x*y,并以十六进制形式显示出来 d) 当输入字符为d,则计算x/y,并以十六进制形式显示出来 三、 实验代码 实验六 DATE SEGMENT X DB ? DATE ENDS ;数据段 CODE SEGMENT ASSUME CS:CODE,DS:DATE START:MOV AX,DATE ;代码段 MOV DS,
3、AX ;初始化ds寄存器 MOV AH,1 INT 21H ;读文件到缓冲区 CMP AL,33H ;比较指令 JB L0 ;A
4、 ;al给x MOV AL,X CMP AL,3H JE L1 ;执行L1命令 CMP AL,4H JE L4 ;执行L4命令 CMP AL,5H JE L6 ;执行L6命令 CMP AL,6H JE L7
5、 ;执行L7命令 L1:MUL AL ADD AL,X ;al+x L5:MOV BL,AL MOV CL,4 SHR AL,CL ;移位指令 CMP AL,9 JLE L2 ;转移指令。小于或等于,或者不大于则转移 ADD AL,7 L2:ADD AL,30H ;寄存器al加0x
6、30 MOV DL,AL MOV AH,2 ;把2放入ah里 INT 21H AND BL,0FH ;逻辑与运算指令 CMP BL,9 JLE L3 ADD BL,7 ;相加 L3:ADD BL,30H MOV DL,BL MOV AH,2 INT 21H JMP L0 L4:MUL AL SUB AL,X
7、SUB AL,X JMP L5 L6:MUL AL JMP L5 L7:MUL AL SHR AL,1 JMP L5 L0:MOV AH,4CH INT 21H CODE ENDS END START 实验七 DATA SEGMENT X DB 0 Y DB 0 W DB 0 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX XOR AX,AX
8、 MOV AH,1 INT 21H CMP AL,39H JBE L1 SUB AL,07H L1:SUB AL,30H MOV X,AL MOV AH,1 INT 21H CMP AL,39H JBE L2 SUB AL,07H L2:SUB AL,30H MOV Y,AL MOV AH,1 INT 21H A:CMP AL,41H JNE B XOR
9、 AL,AL MOV AL,X ADD AL,Y MOV W,AL JMP L3 B:CMP AL,42H JNE C XOR AL,AL MOV AL,X SUB AL,Y MOV W,AL CMP AL,0 JG L3 NEG AL MOV W,AL JMP L3 C:CMP AL,43H JNE D XOR AL,AL MOV AL,X
10、 MUL Y MOV W,AL JMP L3 D:XOR AX,AX MOV AL,X DIV Y MOV W,AL L3:MOV DL,AL MOV CL,4 SHR DL,CL CMP DL,9 JNA L4 ADD DL,07H L4:ADD DL,30H MOV AH,02H INT 21H MOV DL,W AND DL,0FH CMP DL,9
11、 JNA L5 ADD DL,07H L5:ADD DL,30H MOV AH,02H INT 21H MOV AH,4CH INT 21H CODE ENDS END START 四、 实验结果: 实验六结果 实验七结果 五、 实验心得: (1)通过实验使我知道了和熟悉了汇编程序设计的步骤 1.建立数学模型 遇到一个题目,首先要进行全面的分析,根据问题提出的条件,特点,找出规律,找出问题的数学模型或者制定解决问题的规律。 2.绘制程
12、序流程图 流程图能够把比较抽象的问题变得而形象化,并且有助于理清楚思路,便于程序的编制,在程序的易读性和易维护性上有很大的帮助。 3.合理分配存储空间和寄存器 汇编语言能够直接的调用存储器和寄存器。程序运行时,大两量的数据,中间结果或最后的结果都存放在存储器中,且运行的程序目标代码在存储器中,节约空间是一个好的程序应该注意的问题。 4.编制程序 根据语法指令编制程序 5.人工检查 用人工的方式检查程序是否有错,并与时的改正。 6.上机调试 只有通过上机才能验证程序是否正确,经过反复的运行调试,才能得到正确的程序。 (2)掌握了分支程序的结构与分支程序
13、的设计,调试方法和数据传送与算术和逻辑运算指令的用法。 汇编语言程序设计实验 网络*** *** 实验二 循环与子程序程序设计 一、 实验目的 1) 加深对循环结构的理解。 2)掌握循环程序的设计方法。 3)学习子程序的定义和调用方法。 4)掌握子程序、子程序的嵌套、递归子程序的结构。 5) 掌握子程序设计、编制与调试。 6) 熟练掌握DEBUG的常用命令,学会用DEBUG调试程序。 二、 实验内容 1)编制在屏幕上显示九九乘法表的程序。 2)编制在屏幕上显示用*组成的三角形的程序。 三、 实验代码 实验一 DATA SEGMENT S
14、2 DB ? S1 DB ? X DB 1 Y DB 1 S DB 0AH FCH=2AH FDH=3DH FKG=20H FHH=0AH FHC=0DH DATA ENDS STACK1 SEGMENT STACK DB 20H DUP(0) STACK1 ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK1 START:MOV AX,DATA MOV DS,AX MOV CL,9 LL1: PUSH CX ;将CL压入堆栈段 MOV CL,Y LL2: CALL L1
15、 ;调用子程序L1 INC X LOOP LL2 MOV X,1 INC Y MOV DL,FHH ;输出换行和回车 MOV AH,2 INT 21H MOV DL,FHC MOV AH,2 INT 21H POP CX ;从堆栈段中取出CL LOOP LL1 MOV AH,4CH ;程序结束 INT 21H L1 PROC ;计算X*Y=Z并且输出X*Y=Z的子程序 MOV DL,X ADD DL,30H MOV AH,2 INT 21H MOV D
16、L,FCH MOV AH,2 INT 21H MOV DL,Y ADD DL,30H MOV AH,2 INT 21H MOV DL,FDH MOV AH,2 INT 21H MOV AL,X MUL Y DIV S MOV S1,AH ADD AL,30H MOV DL,AL MOV AH,2 INT 21H ADD S1,30H MOV DL,S1 MOV AH,2 INT 21H MOV DL,FKG ;输出空格 MOV AH,2 INT 21H RET L1 ENDP ;子程序
17、结束 CODE ENDS END START 实验二 DATA SEGMENT N DB ? FCH=2AH FDH=3DH FKG=20H FHH=0AH FHC=0DH DATA ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATA START: MOV AX,DATA MOV DS,AX MOV AH,1 ;输入一位16进制数确定输出行数 INT 21H CMP AL,39H JBE L1 SUB AL,07H L1:SUB AL,30H MOV N,AL XOR BX,BX MOV DL,
18、FCH MOV CL,N MOV DL,FHH ;输出换行和回车 MOV AH,2 INT 21H MOV DL,FHC MOV AH,2 INT 21H LOP:PUSH CX INC BL MOV CL,BL MOV DL,FCH LOP2:MOV AH,02H INT 21H LOOP LOP2 POP CX MOV DL,0AH MOV AH,02H INT 21H MOV DL,FHC MOV AH,02H INT 21H CMP BL,9 JZ L2 LOOP LOP L2:MOV AH,4CH
19、 ;程序结束 INT 21H CODES ENDS END START 四、 实验结果: 实验一结果 实验二结果 五、 实验心得 五、 循环程序由初始化部分、循环部分、调整部分、控制部分组成 1〉两种方式,一种是先判断在执行,另一种是先执行再判断。 2〉两种控制循环的方式 a〉计数控制循环 一般使用LOOP指令,要先将循环的次数放入CX中,在多重循环的计数控制中要注保存和复原上一次循环的断点信息,在保留和复原时可以使用堆栈进行处理。 自认为可以理解为一根盘绕了确定的圈数的绳子,又进入的头,又出去的尾。 b
20、〉条件控制循环 一般使用JMP指令使程序跳到这一段的开头,用CMP在循环中进行比较判断,再根据程序要求,选择适当的转移条件,跳出循环。 自认为可以理解为一圆形的导轨,并在导轨上设置一个初口,在符合条件时就在导轨上脱离,否则,将会在导轨上一直的转下去。 3〉再循环中可以同时使用两者,当即已知循环的次数限制范围,但又要求在符合条件时结束循环是,就要同时使用两者。 六、 子程序的使用大大的简化了程序设计的思路,在完成一个程序时,可以简单的把一个程序划分为几个完整的几部分,使每一部分独立的完成特定的一部分和计算任务。 子程序的使用还可以大大的减小程序的体积,在一程序中,如果需要多次
21、反复的是用某一段代码的话,就可以将这段代码设定为子程序,以后想使用时,只要一CALL再一RET就OK啦。 我认为使用子程序的关键在于明白子程序的机理,明白子程序是如何保存和恢复断点的信息的,只有真正的理解了这一点才能更好地利用好子程序。 子程序的参数传递的方式有很多种,但是在堆栈段传递参数时,应该注意使用带立即数的返回的方式,在利用寄存器BP访问堆栈段来取得参数。 汇编语言程序设计实验 网络*** *** 实验三 算术运算与代码转换程序设计 一、实验目的 1)掌握算术运算程序的设计方法。 2)掌握代码转换程序的设计方法。 3)进一步掌握各种程序结构。 4)熟练
22、掌握和使用用DEBUG调试程序。 二、实验内容 1)编制两个多字节整数加法和减法程序,并将结果按十六进制形式显示在屏幕上。 2)编写程序计算从键盘输入两个不超过四位的十进制数的和、差、积、商,并以十进制形式输出。 3)编写程序把从键盘输入的以回车为结束符的字符串中的空格去掉并按相反的顺序输出。 三 实验代码、 实验1 DATA SEGMENT NUM1 DB 22H,33H,44H,55H,66H,77H NUM1L DB 6H NUM2 DB 22H,22H,22H,22H NUM2L DB 4H OUTCOME1 DB 10H DUP(0) OUTCOME2 D
23、B 10H DUP(0) N DB 0H DATA ENDS STACK1 SEGMENT PARA STACK DW 20H DUP(0) STACK1 ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK1 START:MOV AX,DATA MOV DS,AX MOV CH,0 MOV SI,OFFSET NUM1 MOV DI,OFFSET NUM2 MOV AH,NUM1L MOV AL,NUM2L CMP AH,AL JAE CHA XCHG SI,DI XCHG AH,AL CHA:SUB AH,
24、AL MOV CL,AL CLC MOV BX,OFFSET OUTCOME1 LOP1:MOV AL,[DI] PUSH CX MOV CL,[SI] ADC CL,AL MOV [BX],CL INC BX INC SI INC DI POP CX LOOP LOP1 MOV CL,AH JCXZ LOP3 LOP2:PUSH CX MOV CL, BYTE PTR [SI] ADC CL,0 MOV [BX],CL POP CX INC BX INC SI LOOP LOP2 LOP3:MOV CH,0 MOV SI,OFFSET
25、 NUM1 MOV DI,OFFSET NUM2 MOV AH,NUM1L MOV AL,NUM2L CMP AH,AL JAE CHA1 XCHG SI,DI XCHG AH,AL CHA1:SUB AH,AL MOV CL,AL CLC MOV BX,OFFSET OUTCOME2 LOP11:MOV AL,[DI] PUSH CX MOV CL,[SI] SBB CL,AL MOV [BX],CL INC BX INC SI INC DI POP CX LOOP LOP11 MOV CL,AH JCXZ LOP7 LOP21:PUSH
26、CX MOV CL, BYTE PTR [SI] SBB CL,0 MOV [BX],CL POP CX INC BX INC SI LOOP LOP21 LOP7:MOV DI,OFFSET OUTCOME1 ADD DI,10H MOV CX,11H LOP4: MOV DL,[DI] DEC DI CMP N,0H JNE LOP5 CMP DL,0H JE LOP9 LOP5:PUSH DX PUSH CX MOV CL,4H SHR DL,CL POP CX CMP DL,9H JBE LOP6 ADD DL,7H LOP6:AD
27、D DL,30H MOV AH,2 INT 21H MOV N,1H POP DX AND DX,0FH CMP DL,9H JBE LOP8 ADD DL,7H LOP8:ADD DL,30H MOV AH,2 INT 21H MOV DL,'H' MOV AH,2 INT 21H LOP9:LOOP LOP4 MOV N,0 MOV DI,OFFSET OUTCOME2 ADD DI,10H MOV CX,11H LOP14: MOV DL,[DI] DEC DI CMP N,0H JNE LOP15 CMP DL,0H JE LOP19
28、 LOP15:PUSH DX PUSH CX MOV CL,4H SHR DL,CL POP CX CMP DL,9H JBE LOP16 ADD DL,7H LOP16:ADD DL,30H MOV AH,2 INT 21H MOV N,1H POP DX AND DX,0FH CMP DL,9H JBE LOP18 ADD DL,7H LOP18:ADD DL,30H MOV AH,2 INT 21H MOV DL,'H' MOV AH,2 INT 21H LOP19:LOOP LOP14 MOV AH,4CH INT 21H CODE
29、ENDS END START 实验2 DATA SEGMENT TISHI1 DB 'Please enter the first number:','$' TISHI2 DB 'Please enter the second number:','$' JIA DB '+','$' JIAN DB '-','$' CHENG DB '*','$' CHU DB '/','$' DENG DB '=','$' YU DB '......','$' A DB 10 B DW 10 C DW 10000 F DW 0H NUM1 DW 0H NUM2 DW 0H
30、 N DB 0H N1 DB 4H DATA ENDS STACK1 SEGMENT STACK DW 30H DUP(0) STACK1 ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATA START:MOV AX,DATA MOV DS,AX MOV DX,OFFSET TISHI1 MOV AH,09H INT 21H LOOP2:MOV AX,NUM1 MUL B MOV BX,AX MOV AH,1 INT 21H CMP AL,0DH JE LOP1 MOV NUM1,BX MOV
31、 AH,0 SUB AL,30H ADD NUM1,AX JMP LOOP2 LOP1:MOV DL,0AH ;输出换行和回车 MOV AH,2 INT 21H MOV DL,0DH MOV AH,2 INT 21H MOV DX,OFFSET TISHI2 MOV AH,09H INT 21H LOOP1:MOV AX,NUM2 MUL B MOV BX,AX MOV AH,1 INT 21H CMP AL,0DH JE LOP3 MOV NUM2,BX MOV AH,0 SUB AL,30
32、H ADD NUM2,AX JMP LOOP1 LOP3:MOV DL,0AH ;输出换行和回车 MOV AH,2 INT 21H MOV DL,0DH MOV AH,2 INT 21H MOV N,0 MOV DX,NUM1 MOV F,DX LOP6:MOV DX,0H MOV AX,F DIV B PUSH DX INC N CMP AX,0H JE LOP7 MOV F,AX JMP LOP6 LOP7:MOV CL,N MOV CH,0 LOP16:POP DX
33、 ADD DX,30H MOV AH,2 INT 21H LOOP LOP16 MOV DX,NUM2 MOV F,DX MOV N,0 MOV DX,OFFSET JIA MOV AH,09H INT 21H LOOOP6:MOV DX,0H MOV AX,F DIV B PUSH DX INC N CMP AX,0H JE LOOOP7 MOV F,AX JMP LOOOP6 LOOOP7:MOV CL,N MOV CH,0 LOOOP16:POP DX ADD DX,30H
34、 MOV AH,2 INT 21H LOOP LOOOP16 MOV DX,OFFSET DENG MOV AH,09H INT 21H MOV N,0 LOOP3:MOV AX,NUM1 ADD AX,NUM2 MOV F,AX LOOP4:MOV DX,0H MOV AX,F DIV B PUSH DX INC N CMP AX,0H JE LOOP5 MOV F,AX JMP LOOP4 LOOP5:MOV CL,N MOV CH,0 LOOP0:POP DX AD
35、D DX,30H MOV AH,2 INT 21H LOOP LOOP0 MOV DL,0AH ;输出换行和回车 MOV AH,2 INT 21H MOV DL,0DH MOV AH,2 INT 21H MOV N,0 MOV DX,NUM1 MOV F,DX LOP61:MOV DX,0H MOV AX,F DIV B PUSH DX INC N CMP AX,0H JE LOP71 MOV F,AX JMP LOP61 LOP71:MOV CL,N MOV
36、CH,0 LOP161:POP DX ADD DX,30H MOV AH,2 INT 21H LOOP LOP161 MOV DX,NUM2 MOV F,DX MOV N,0 MOV DX,OFFSET JIAN MOV AH,09H INT 21H LOOOP61:MOV DX,0H MOV AX,F DIV B PUSH DX INC N CMP AX,0H JE LOOOP71 MOV F,AX JMP LOOOP61 LOOOP71:MOV CL,N MOV CH,0 LOO
37、OP161:POP DX ADD DX,30H MOV AH,2 INT 21H LOOP LOOOP161 MOV DX,OFFSET DENG MOV AH,09H INT 21H MOV N,0 MOV N,0 MOV AX,NUM1 SUB AX,NUM2 MOV F,AX AND AX,10000000B CMP AX,10000000B JNE LOOP6 NEG F LOOP6:MOV DX,0 MOV AX,F DIV B PUSH DX INC N CM
38、P AX,0H JE LOOP7 MOV F,AX JMP LOOP6 LOOP7:MOV CL,N MOV CH,0 LOOP16:POP DX ADD DX,30H MOV AH,2 INT 21H LOOP LOOP16 MOV DL,0AH ;输出换行和回车 MOV AH,2 INT 21H MOV DL,0DH MOV AH,2 INT 21H MOV N,0 MOV DX,NUM1 MOV F,DX LOP62:MOV DX,0H MOV AX,F
39、DIV B PUSH DX INC N CMP AX,0H JE LOP72 MOV F,AX JMP LOP62 LOP72:MOV CL,N MOV CH,0 LOP162:POP DX ADD DX,30H MOV AH,2 INT 21H LOOP LOP162 MOV DX,NUM2 MOV F,DX MOV N,0 MOV DX,OFFSET CHENG MOV AH,09H INT 21H LOOOP62:MOV DX,0H MOV AX,F DIV B PUSH D
40、X INC N CMP AX,0H JE LOOOP72 MOV F,AX JMP LOOOP62 LOOOP72:MOV CL,N MOV CH,0 LOOOP162:POP DX ADD DX,30H MOV AH,2 INT 21H LOOP LOOOP162 MOV DX,OFFSET DENG MOV AH,09H INT 21H MOV N,0 MOV AX,NUM1 MUL NUM2 DIV C PUSH DX MOV F,AX MOV N,0 LOOP
41、8:MOV DX,0 MOV AX,F DIV B PUSH DX INC N CMP AX,0H JE LOOP9 MOV F,AX JMP LOOP8 LOOP9:MOV CL,N MOV CH,0 LOOP17:POP DX ADD DX,30H MOV AH,2 INT 21H LOOP LOOP17 MOV N,0 POP F LOOP10:MOV DX,0H MOV AX,F DIV B PUSH DX INC N CMP AX,0H JE L
42、OOP11 MOV F,AX JMP LOOP10 LOOP11:MOV AL,N CMP AL,4H JE LOOP20 MOV AL,4H SUB AL,N MOV CL,AL MOV CH,0 LOOP19:MOV DX,'0' MOV AH,2 INT 21H LOOP LOOP19 LOOP20:MOV CL,N MOV CH,0 LOOP18:POP DX ADD DX,30H MOV AH,2 INT 21H LOOP LOOP18 MOV DL,0AH
43、 ;输出换行和回车 MOV AH,2 INT 21H MOV DL,0DH MOV AH,2 INT 21H MOV N,0 MOV DX,NUM1 MOV F,DX LOP64:MOV DX,0H MOV AX,F DIV B PUSH DX INC N CMP AX,0H JE LOP74 MOV F,AX JMP LOP64 LOP74:MOV CL,N MOV CH,0 LOP164:POP DX ADD DX,30H MOV AH,2 INT 21H LOOP
44、 LOP164 MOV DX,NUM2 MOV F,DX MOV N,0 MOV DX,OFFSET chu MOV AH,09H INT 21H LOOOP64:MOV DX,0H MOV AX,F DIV B PUSH DX INC N CMP AX,0H JE LOOOP74 MOV F,AX JMP LOOOP64 LOOOP74:MOV CL,N MOV CH,0 LOOOP164:POP DX ADD DX,30H MOV AH,2 INT 21H LOOP LOOOP164
45、 MOV DX,OFFSET DENG MOV AH,09H INT 21H MOV N,0 MOV AX,NUM1 MOV DX,0 DIV NUM2 PUSH DX MOV F,AX MOV N,0 LOOP15:MOV DX,0 MOV AX,F DIV B PUSH DX INC N CMP AX,0H JE LOOP12 MOV F,AX JMP LOOP15 LOOP12:MOV CL,N MOV CH,0 LOOP21:POP DX AD
46、D DX,30H MOV AH,2 INT 21H LOOP LOOP21 MOV DX,OFFSET YU MOV AH,09H INT 21H POP F MOV N,0 LOOP13:MOV DX,0 MOV AX,F DIV B PUSH DX INC N CMP AX,0H JE LOOP14 MOV F,AX JMP LOOP13 LOOP14:MOV CL,N MOV CH,0H LOOP22:POP DX ADD DX,30H MOV AH,2 INT
47、 21H LOOP LOOP22 MOV AH,4CH INT 21H CODES ENDS END START 实验3 DATA SEGMENT LENG DW 0H DATA ENDS STACK1 SEGMENT PARA STACK DW 30H DUP(0) STACK1 ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK1 START:MOV AX,DATA MOV DS,AX LOOP1:MOV AH,1 INT 21H CMP AL,20H JE LOOP1 INC LENG
48、 MOV AH,0 PUSH AX CMP AL,0DH JNE LOOP1 MOV DL,0AH ;输出换行和回车 MOV AH,2 INT 21H MOV DL,0DH MOV AH,2 INT 21H POP DX DEC LENG MOV CX,LENG LOOP2:POP DX MOV AH,2 INT 21H LOOP LOOP2 MOV AH,4CH INT 21H CODE ENDS END START 四 实验结果 实验1结果 实验2结果 实验3结果 五 实验心得 1. 计算机中处理的信
49、息不全是数,有时需要处理字符或字符串,因此,计算机中必须能表示字符。 这些字符在计算机中用二进制表示,最常用的是ask值表示 1〉当我们利用指令 MOV AH,1H INT 21H 输入数字时,所得到存放在AL中的并不数字本身,而是相对应的ask值,因此,在输入后需要对字符进行深加工后才能够使用,有时还需要通过判断来决定对字符串的处理方式。 2〉当程序运行得到结果时,我们在输出结果时,依然要得到相对应的ask值之后才能输出,在转换为相对应的ask值时,依然要通过判断来决定处理的方式,例如,在以十六进制输出结果时,就要判断是加上30H还是加上37H。然后将ask值放DL中,再利用
50、MOV AH,2H INT 21H 输出。 3.将输入的一段字符串反序输出时,我认为堆栈是最好的选择,因为堆栈是‘先进后出’的原则,所以最先输入的最后输出。 汇编语言程序设计实验 网络*** *** 实验五 输入输出程序设计 一、实验目的 1) 掌握输入输出程序的编写方法。 2) 熟悉系统功能调用的方法。 3) 熟悉动画程序的编写方法。 二、实验内容 1)编制字母下落一行的子程序,调用该子程序使字母从屏幕顶部下落到底部。 2)编写程序将屏幕分割成格状,每一格涂上不同颜色,格数从键盘输入。 三、实验代码 实验一 DATA






