汇编语言程序设计实验指导书
MOV CX, [BP+8] MOV AX, [BP+6] XOR AH, AH AGAIN: CMP AL.[SI] JNE NEXT1 INC AH NEXT1: INC SI LOOP AGAIN MOV AL, AH MOV [BP+10],AX POP BP RET 4 CHECK ENDP
END START
A---------------------------------------------------A
B——————————————————————B
实验B 子程序设计
一、预习内容
1.子程序调用方法和参数传递方式。 2.过程调用伪指令: PROC,ENDP和NEAR。 3.子程序调用中堆栈的用法。 4.简化格式程序设计方法。
二、目的要求
1.掌握子程序调用方法和参数传递方式。 2.掌握过程调用伪指令: PROC,ENDP和NEAR。 3.理解子程序调用中堆栈的用法。 4.熟悉简化格式程序设计方法。
三、实验内容
显示学生名次表rank。要求接收从键盘输入的一个班的学生成绩,并存放于10字的grade数组中,其中grade+i保存学号为i+1的学生的成绩。然后根据grade中的学生成绩,把学生名次填入10字的rank数组中,其中rank+i的内容是学号为i+1学生的名次。再按学号把名次从终端显示出来。源程序如下,模块层次如图所示,源程序已经完成了mian, input, rankp, output, bindec和dec_div模块的编写,模块decbin和crlf需要自己完成。
Page 16 of 25
.model small .stack .data
grade dw 10 dup(?) rank dw 10 dup(?) count dw ?
mess1 db 'Grade?','$'
mess2 db 13,10,'Iput Error!',13,10,'$' mess3 db 'Rank:','$' .code
main proc far
start : mov ax, @data mov ds, ax call input call rankp call output mov ax, 4c00h int 21h main endp
input proc near
mov dx,offset mess1 mov ah,09 int 21h mov si,0 mov count,0 enter:
call decibin inc count cmp dl,',' je store
cmp dl,13 ;is it 'return'? je exit2 jne error store:
mov grade[si],bx add si,2 jmp enter error:
lea dx,mess2 mov ah,09 int 21h exit2:
mov grade[si],bx call crlf
Page 17 of 25
ret input endp
rankp proc near mov di,count mov bx,0 loop1:
mov ax,grade[bx]
mov word ptr rank[bx],0 mov cx,count lea si,grade next:
cmp ax,[si] jg no_count
inc word ptr rank[bx] no_count: add si,2 loop next add bx,2 dec di jne loop1 ret
rankp endp
output proc near lea dx,mess3 mov ah,09 int 21h mov si,0 mov di,count next1:
mov bx,rank[si] call binidec mov dl,',' mov ah,02 int 21h add si,2 dec di jnz next1 call crlf ret
output endp
decibin proc near
decibin endp binidec proc near push bx ; push cx ; push si ; push di ; mov cx,100d call dec_div dec_div proc near mov ax,bx mov dx,0 div cx mov bx,dx mov dl,al add dl,30h mov ah,02h mov cx,10d call dec_div mov cx,1 call dec_div pop di pop si pop cx pop bx ret
binidec endp int 21h ret
dec_div endp
; crlf proc near ; 。。。 ; 。。。
; crlf endp end main
Page 18 of 25
第 19 页 共 25 页
四、实验步骤
1.认真阅读程序,自己编写十进制到二进制转换子程序decibin和输出回车换行子程序crlf,将程序补充完整,然后汇编、链接、生成可执行文件。
2.用DEBUG的断点命令和T命令运行此程序,观察并记录每次过程调用和进出栈指令前后(带';'的语句)的SP和堆栈内容,如记录执行call input,call rankp,call output三条指令后sp,bp以及[sp]的值。
3.记录数据段各变量的最后结果。
五、实验报告或作业
1.画出input,output和rankp模块的流程图。
2.汇编,连接及调试时产生的错误,其原因及解决办法。 3.记录执行call input ,call rankp,call output三条指令后sp,bp以及[sp]的值,并指出[sp]指向哪条指令。
4.画出堆栈满时堆栈存储区域的示意图。 5.记录最后的输出结果。
6.思考: 如果想用堆栈传递参数,源程序应做何修改?
B———————————————————————B
实验六 I/O程序设计
A---------------------------------------------------A
实验A
一、预习内容
1.程序直接控制I/O方式。 2.I/O程序设计方法。 3.子程序设计方法
二、目的要求
1.掌握程序直接控制I/O方式。 2.熟悉I/O程序设计方法。 3.继续熟悉子程序设计方法。
三、实验内容
用位触发方式(也即程序直接控制输出控制寄存器(I/O端口为61h)的第一位,使该位按所需要的频率进行1和0的交替变化,从而控制开关电路产生一串脉冲波形,这些脉冲经放大后驱动扬声器发声音)模拟枪响程序。
程序如下,但其中有些语句错误,需要修改后才能正确运行。 code segment main proc far assume cs:code start:
mov cx,50d new_short:
push cx call shoot mov cx,0f000h silent:
loop silent pop cx
Page 19 of 25
第 20 页 共 25 页
loop new_short mov al,48h out 61h,al mov ax,4c00h int 21h main endp
shoot proc near
mov dx,140h mov bx,20h in al,61h
and al,11111100b sound:
xor al,2 out 61h,al add dx,9248h mov cl,3 ror dx,cl mov cx,dx and cx,1ffh or cx,1000h delay: push cx wait:
loop wait pop cx
loop delay dec bx jnz sound
and al,11111100b out 61h,al ret shoot endp code ends end start
实验步骤
1.认真阅读程序,将源程序中的错误找出后修改。
2.编译,链接,生成可执行文件,记录编译过程中的错误,并分析原因。 3.执行程序,调式程序,直到可以清楚听到枪响的声音。
四、实验报告或作业
1.分析程序,画出程序流程图。
2.汇编,连接及调试时产生的错误,其原因及解决办法。 3.思考:
试将程序中的黑体部分修改为 wait: loop wait,再编译运行程序,是否能听到枪声,为什么?
A---------------------------------------------------A
Page 20 of 25