汇编语言程序设计实验指导书
B—————————————————————B
实验B (选做)
一、预习内容
1.分支程序设计方法。
2.利用转移指令jl、jmp实现多岔分支的方法。
二、目的要求
1.掌握分支程序设计方法。
2.掌握利用转移指令jl、jmp实现多岔分支的方法。
三、实验内容
统计学生成绩result。设有10个学生的成绩分别为56、69、84、82、73、88、99、63、100和80分。试编制程序分别统计低于60分、60~69分、70~79分、80~89分、90~99分及100分的人数,并分别存放到s5、s6、s7、s8、s9及s10单元中
DSEG SEGMENT
grade dw 56,69,84,82,73,88,99,63,100,80
s5 dw 0 s6 dw 0 s7 dw 0 s8 dw 0 s9 dw 0 s10 dw 0 DSEG ENDS CSEG SEGMENT
assume cs:CSEG, ds:DSEG start:
mov ax, dseg mov cx,10
mov bx,offset grade
compare:
mov ax, [bx] cmp ax,60 jl five cmp ax,70 jl six cmp ax,80 jl seven cmp ax,90 jl eight
mov ds, ax
Page 11 of 26
汇编语言程序设计实验指导书
cmp ax,100 jne nine
① ②
nine:
inc s9
jmp short change_addr
eight:
inc s8
jmp short change_addr
seven:
inc s7
jmp short change_addr
six:
inc s6
jmp short change_addr
five:
inc s5
change_addr:
③ ④ mov ax, 4c00h int 21h
CSEG ENDS
end start
实验步骤:
1.阅读程序,将程序补充完整。 2.输入,汇编并连接此程序。
3.在DEBUG下运行此程序,记录运行结果。
4.单步运行程序,记录前五次执行转移指令后寄存器cs ip的值。
四、实验报告或作业
1.分析程序,画出程序流程图。
2.汇编,连接及调试时产生的错误,其原因及解决办法。 3.每次执行转移指令时寄存器cs ip的值。
4、最终运行结果,即s5、s6、s7、s8、s9及s10的值。 5、思考:
如何修改程序使源程序先统计s10,然后依次统计s9,s8,s7,s6,s5?
B———————————————————————B
实验五 子程序设计
Page 12 of 26
汇编语言程序设计实验指导书
A---------------------------------------------------A 实验A(必做)
本实验的目的在于让读者掌握同一模块调用的方法。 一、 实验目的
1 掌握主程序与子程序之间的调用关系及调用方法。 2 掌握子程序调用过程中近程调用与远程调用的区别。 3 掌握通过堆栈转送参数的方法。 二、 实验内容
1 将BUF开始的10个单元中的二进制数转换成两位十六进制数的ASCII码,在屏幕
上显示出来。要求码型转换通过子程序HEXAC实现,在转换过程中,通过子程序DISP实现显示.
2 编写一个主程序,从键盘接收若干个字符,然后用远调用的方法,调用子程序统计
字符串中字符’b’的个数.子程序的参数是字符串的首地址TABLE,字符串长度N及字符”b”.子程序返回字符"b”的个数.参数传送采用堆栈实现.主程序在子程序返回后,显示字符”b”及其个数(设为一位十六进制数).
三、 实验说明
1 第一个实验程序用子程序的近程调用实现。由于在调用HEXASC子程序时,子程序
又调用了DISP子程序,这叫子程序的嵌套调用。实验过程中可以从堆栈的内容看到两个子程序的返回地址值。由于是近调用,地址值只包括返回地址的段内偏移量。在每个子程序的执行中,检查CS值是不变的。
2 第二个程序是利用远调用的方法调用子程序的。在远调用情况下,主程序与子程
序处在不同的逻辑代码段中,可在子程序执行中查看CS值,它与主程序中的CS值是不同的。子程序调用后,堆栈中保留了返回地址的段地址及段内偏移量。
3 第二个程序中,主程序与子程序之间参数的传送是由堆栈实现的。一段是将参数
(此处是串首址TABLE,串的长度N及待统计的字符“b”)顺序压如堆栈,在子程序调用后,通过BP指针对堆栈中的参数访问,并将统计的结果通过堆栈返回。有关该方法的原理此处不再介绍。
四、 实验准备
1 预习子程序设计的基本方法,根据实验内容要求,画出子程序及主程序的流程图。 2 熟悉键盘键入字符串及用堆栈传送参数的程序段编制方法。 五、 实验步骤
1 编辑、汇编两个源程序,生成相应的可执行文件(。EXE) 2 用DEBUG的R 命令,T 命令或G命令和D命令检查远程调用及近程调用时堆栈的
变化。特别是通过堆栈传送的参数和子程序取出的参数是返回参数的详细过程。
3 检查程序执行的结果是否正确。 六、 实验报告要求
1 分析远程调用与近程调用的区别,在用DEBUG有关命令观察时,执行过程有何不
同。
2 说明用堆栈传送参数的过程及其具体方法。
3 分析实验结果及所遇到问题,并说明解决的方法。 七、参考程序清单
Page 13 of 26
汇编语言程序设计实验指导书
(1) 码型转换程序清单:
;CONV.ASN DATA SEGMENT
BUF DB 0ABH,0CDH,0DEH,01H,02H,03H
DB 3AH,4BH,5CH,6FH
DATA ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV CX,10 LEA BX,BUF AGAIN: MOV AL, [BX] CALL HEXASC INC BX LOOP AGAIN MOV AH,4CH INT 21H HEXASC PROC NEAR
MOV DL,AL PUSH CX MOV CL,4 SHR DL,CL POP CX
CALL DISP ;显示高位HEX数 MOV DL,AL AND DL,0FH CALL DISP RET HEXASC ENDP DISP PROP
CMP DL,9 JBE NEXT ADD DL,7 NEXT: ADD DL,30H MOV AH,2
INT 21H ;显示 RET DISP ENDP CODE ENDS
END START
(2)统计并显示某键入字符的个数的程序:
Page 14 of 26
汇编语言程序设计实验指导书
:COUNTER.ASM DATA SEGMENT CHAR DB ‘b’
BUF DB 50H, ? 50H DUP(?) DATA ENDS MCODE SEGMENT
ASSUME CS: MCODE, DS: DATA START: MOV AX,DATA MOV DS,AX LEA DX,BUF MOV AH,9 ] INT 21H
LEA SI BUF MOV CL, [SI+1]
MOV CH, 0 ;CX中为字符串长度 INC SI
INC SI ;SI指向串首址TABLE MOV AL,CHAR
MOV AH,0 ;AX中为待查字符 PUSH SI
PUSH CX
PUSH AX ; 参数送堆栈 CALL CHECK
POP AX :统计个数在AL中
MOV DL,CHAR MOV AH,2 INT 21H MOV DL,AL AND DL, 0FH CMP DL,9 JBE NEXT ADD DL,7 NEXT: ADD DL,30H MOV AH,2
INT 21H ;显示统计个数 MOV AH,4CH INT 21H M CODE ENDS SCODE SEGMENT
ASSUME CS:SCODE CHECK PROC FAR PUSH BP MOV BP,SP
MOV SI,[BP+10]
Page 15 of 26