合肥学院微机实验4(子程序调用实验代码及解析)

合肥学院微机实验4(子程序调用实验代码及解析),第1张

BUFFER DB 10 DUP(?)BUFFER存放8个不确定数

augend DB 2 DUP(?)加数

addend DB 2 DUP(?)加数

msg1DB 0DH,0AH,'请输入被加数: $'

msg2DB 0DH,0AH,'请输入加数: $'

msg3DB 0DH,0AH,'结果:$'msg3存放结果

0DH和0AH分别是回车和换行的ASCII码,

'$'是DOS功能调用INT 21H中肢纤辩9号功能要求的要显示字符串的结束标志

.CODE

START: MOV AX,@DATA

MOV DS,AX

MOV ES,AX

CLD 方向标志位清零 CLD与STD是用来 *** 作方向标志位DF(Direction Flag)。

CLD使DF复位,即DF=0,STD使DF置位,即DF=1.用于串 *** 作指令中

NOP 空 *** 作 NOP指令只使程序计数器PC加1,所以占用一个机竖枣器周期

其目的为保证写、读之间有个稳定时间

MOV AH,00H

MOV AL,03H

INT 10H 清屏

START1: MOV AH,09H 9号调用DX指向被加数的首地址,输出提示信息

LEA DX,msg1将源 *** 作数给出的有效地址传送到指定的的寄存器中

INT 21H

LEA DI,augend DI->augend的首地址

MOV CX,4按键次数

CALLGetBCDKey 得到双字节十进制数(被加数)

JNB START2 没有输入任何数字,结束 CF=0

MOV AH,09H 9号调用DX指向加数的首地址

LEA DX,msg2将源 *** 作数给出的有效地址传送到指定的的寄存器中

INT 21H

LEA DI,addend di指向加数

MOV CX,4按键次数

CALLGetBCDKey 得到双字节十进制数(加数)

JNB START2 没有输入任何数字,结束

MOV AL,augend 被加数的低8位送al

ADD AL,addend al与加数的低位相加的结果送al

DAA BCD算术运算调整,转换为压历缺缩型BCD

XCHGAL,AH 高位与低位互换

MOV AL,augend + 1

ADC AL,addend + 1 高位

DAA

XCHGAL,AH

MOV BL,0

ADC BL,0进位 bl存放的是进位 bl和ax相加是最后的结果

STD 方向标志置1

LEA DI,BUFFER+4 存放显示结果

CALLB1toB2 低位

MOV AL,AH

CALLB1toB2 高位

MOV AL,BL

OR AL,30H 转换成数字

STOSB 存数

LEA SI,BUFFER

MOV CX,5

CALLBlackDisplay将高位0消隐

MOV AH,09H

LEA DX,msg3 9号调用DX指向结果的首地址

INT 21H

MOV AH,09H

LEA DX,BUFFER 9号调用DX指向BUFFER的首地址

INT 21H

JMP START1 跳转到START1

START2: MOV AH,4CH 结束程序

INT 21H

JMP $

将一个字节压缩BCD码转换成二个字节数字

B1toB2 PROCNEAR段内

PUSHAX ax存放的是相加后的结果

AND AL,0FH 高四位置0

OR AL,30H 加30H

STOSB 存数 个位 百位

POP AX

AND AL,0F0H 低四位置0

ROR AL,4循环右移4位

OR AL,30H 加30H

STOSB 存数 十位 千位

RET

B1toB2 ENDP

BlackDisplayPROCNEAR

CLD方向标志清零

MOV DI,SI si送给di si指向buff的第一个缓冲区 增量变化

BlackDisplay1: LODSB 将高位0消隐,取串

CMP AL,'0'

JNZ Exit 若al不等于0跳转EXIT

LOOPBlackDisplay1否则cx不为0一直循环 cx次

INC CX cx加1

Exit: DEC SI si前移

REP MOVSB重复传送字节

MOV AL,'$' 把$符送al

STOSB存数

RET

BlackDisplayENDP

GetBCDKey PROCNEAR

LEA SI,BUFFER

MOV AL,4 把4写入到buff

MOV [SI],AL 【】是内存单元

MOV DX,SI

MOV AH,0AH dx指向缓冲区

MOV AL,02H 0:任意字符 1:16进制数 2:10进制数,10进制数输入

INT 21H

GetBCDKey1: LODSBds:si->al

AND AL,0FH 高4位清零

CMP CX,1

JE GetBCDKey2

DEC CX 进数位-1

MOV AH,AL

LODSB

AND AL,0FH

SHL AL,4 逻辑左移4位

OR AL,AH

GetBCDKey2: CLD

STOSB 存串指令

STD

LOOPGetBCDKey1 cx=2 原先为4 上面减了一次一 loop再减一所以等于2

MOV CL,[BUFFER]

SUB CL,[BUFFER+1]

SHR CL,1逻辑右移1位

MOV AL,0

CLD

REP STOSB 重复存数

STC进位标志位置1

RET

GetBCDKey3: CLC 进位标志位清零cf=0

RET 返回

GetBCDKey ENDP

1、在电脑桌面上打开MATLAB。

2、当你没有把你编辑好的子函数放入正确的文件夹时,不管你输入的程序是否有错袜升,当你执行时,系统都会提示“没有定义”,这个时候就是没有子函数文件放到主函数库文件夹中。

3、首先,输入“edit conv”这个“conv”是我准备编辑的子函数的主函数名,每个人所需的主函数名都不一样,这里可以不要那岩好清么在意。然后就可以打粗前开相应的主函数,这是可以看到主函数所在文件夹位置。如图所示,※记住这个位置。

4、然后进行子函数的编辑,首先新建一个新的m文件,然后在编辑框中输入所要的子函数,例如我就是输入了convnem的函数,这是conv的子函数。然后点击保存。

5、接下来,在“conv”所在文件位置,将位置记录下来,将子函数的文件保存到主函数所在的文件夹即可,然后在重新的将你所需的程序(含有子函数的)输入并且执行,这时你会发现原来提示的错误没有了,那么这时调用自己添加的子函数成功了。以后有相应的子函数都可以通过这样的方法进行添加子函数。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12349213.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存