实验二 数码转码编程及程序调试
第一题将 ASCII 码表示的十进制数转换为二进制数
【代码如下】
;实验二第一题 将 ASCII 码表示的十进制数转换为二进制数
DATA SEGMENT
DB 30 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV SI,3500H
MOV DI,3510H
MOV BX,0AH
MOV CX,0004H
MOV AH,00H
MOV AL,[SI]
SUB AL,0030H
LOOP: MUL BX
INC SI
ADD AL,[SI]
SUB AL,0030H
DEC CX
JNZ LOOP
MOV [DI],AX
JMP QUIT
QUIT:
MOV AH,004CH
INT 21H
CODE ENDS
END START
;定一源地址
;定义目标地址
;给 BX 赋值 10 便于后面相乘
;赋给 CX 要装换的位数
;将 AH 清零
;转换结束跳出循环
【调试结果】
输入 30 30 30 31 35 时,输出为 0015H
输入 30 30 30 30 36 时,输出为 0006H
调试结果证明程序正确
2、将从键盘输入的五位十进制数的 ASCII 码已存在 3500 起始的内存单元中。把
它转换成 BCD 码后,再按位分别存入 350A 起始的内存单元内。若输入的不是
十进制的 ASCII 码,则显示 FF.
【代码如下】
;实验二 第二小题
DATA SEGMENT
DB 30 DUP(?)
ENDS
SEGMENT
ASSUME CS:CODE,DS:DATA
DATA
CODE
START:
MOV CX,0005H
MOV SI,3500H
;循环次数设置为 5
;源地址设置为 3500H
MOV DI,3510H
;目的地址设置为 3510H
L1:
MOV DL,0FFH
;给 DL 赋值 0FFH,便于后面 输入错误是赋给[DI]值 FF,但不能直接给[DI]赋值 0FFH,会溢出
;判断大于 9 则赋值 FF
;判断小于 0 则赋值 FF
;转换为 BCD 码
MOV AL,[SI]
CMP AL,0039H
JG ERROR
CMP AL,0030H
JB ERROR
SUB AL,30H
MOV [DI],BYTE PTR AL
INC SI
INC DI
DEC CX
JNZ L1
JMP QUIT
L2:
ERROR: MOV [DI],DL
;赋值 FFH
JMP L2
QUIT:
MOV AX,4C00H
INT 21H
CODE ENDS
END START
【调试结果】
输入为 23 34 38 47 32 时
当输入为 12 34 38 54 71 时
5、BCD 码转换为二进制码
【代码如下】
;第二次试验第五题
;BCD 码转换为二进制码
DATA SEGMENT
DB 30 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
AGAIN:
MOV CX,08H
MOV SI,3500H
MOV DI,3510H
MOV AL,[SI]
MOV BL,0AH
MUL BL
INC SI
MOV AH,00H
MOV DL,[SI]
ADD AL,DL
MOV [DI],AX
INC DI
INC SI
DEC CX
JNZ AGAIN
JMP QUIT
切记
;初始化
;此处记得将 SI 增加 1,否则会多 4 个数字 ,
QUIT:
MOV AX,4C00H
INT 21H
CODE ENDS
END START
【调试结果】
3、 将十六位二进制数转换为 ASCII 码表示的十进制数。
【代码如下】
;第二次试验 第三题
;十六位二进制数转换为 ASCII 码表示的十进制数
DATA SEGMENT
DB 30 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
AGAIN:
MOV DI,3500H
MOV AX,[DI]
MOV SI,3514H
INC SI
DEC SI
MOV DX,0000H
MOV BX,000AH
DIV BX
ADD DL,30H
MOV [SI],DL
;错误理解二进制 存到 AX 的意思
;此处被除数必须为寄存器
CMP AX,0H
;判断商是否为 0,不是就重复,是就比较 SI 是不是
等于 3500,是就退出
JNZ AGAIN
CMP SI,3500
JE QUIT
AGAIN1:
DEC SI
MOV DL,30H
MOV [SI],DL
CMP SI,3510H
JNZ AGAIN1
MOV AX,004CH
INT 21H
QUIT:
CODE ENDS
END START
【调试结果】
4、 十六进制数转换为 ASCII 码
【代码如下】
;第二次实验第四题
; 十六进制数转换为 ASCII 码
DATA SEGMENT
DB 30 DUP(?)
DATA ENDS
;初始化过程
;小于 9 则直接装换为 ACSSII 码
;大于 9 则加 37
;存储结果至[DI]所在单元
;为了后面用到 CL 作为右移计数用,此处先
STACK SEGMENT STACK 'STACK'
DB 30 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
AGAIN:
L1:
L2:
MOV CX,0004H
MOV SI,3500H
MOV DI,3510H
MOV DX,[SI]
MOV AX,DX
AND AX,000FH
CMP AL,09H
JL
ADD AL,37H
JMP L2
ADD AL,30H
L1
MOV [DI],AL
INC DI
PUSH CX
将 CX 压栈
MOV CL,04H
SHR DX,CL
POP CX
DEC CX
JNZ AGAIN
JMP QUIT
QUIT:
MOV AX,4C00H
INT 21H
CODE ENDS
END START
【调试结果】
微机实验三 分支和循环程序设计实验
实验 1
【代码如下】
;实验三(1)
STACK SEGMENT STACK
DW 64 DUP(?)
STACK ENDS
CODE
SEGMENT
ASSUME CS:CODE
START:
MOV SI,3500H
MOV DI,3510H
MOV CX,0006H
CLD
CMP SI,DI
JL L1
JMP L2
L1:
ADD SI,CX
ADD DI,CX
LOOP1:
DEC SI
DEC DI
MOV AL,[SI]
MOV [DI],AL
DEC CX
;给 SI 附地址
;DF 置 0
;比较源数据块和目的块首地址
;源数据块地址小于目的数据块地址时跳到 L1
;否则跳到 L2
;数据搬移