实验具体内容

  1. 十六进制转换十进制数
  2. 判断闰年
  3. 两个十进制数相加

1. 十六进制转换十进制数

(1)流程图

img

(2)汇编源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
DATAS SEGMENT
str1 db 10,13,'Please input a hex number(Support up to 4 hexadecimal numbers):',13,10,'$'
str2 db 'the dec number:',13,10,'$'
str3 db 'the bin number:',13,10,'$'
str4 db 'the input error!',13,10,'$'
cr db 13,10,'$';回车
bin dw 10 dup(?);用于存放输入的数据对应的二进制
buf db 5 dup(?);用于存放对应的十进制数

DATAS ENDS

CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX;将使用到的数据段地址传送给DS

lea dx,str1
mov ah,9
int 21h;显示提示输入
mov bx,0
input:
mov ah,1
int 21h;输入一个字符

cmp al,13
je en;如果输入的是回车字符,则跳转到准备输出

sub al,30h;al=al-30h
jb error;跳转说明字符是符号字符
cmp al,10
jb transbin;跳转说明字符是‘0’~‘9’

sub al,7;al=al-7
cmp al,0ah
jae next1
jmp error;在这跳转说明字符是‘9’~‘A’之间的符号字符


next1:
cmp al,10h
jb transbin;跳转说明字符是'A'~'F'

sub al,20h;al=al-20h
cmp al,0ah
jae next2
jmp error;在这跳转说明是其他字符

next2:
cmp al,10h
jb transbin;跳转说明字符是'a'~'f'

error:
lea dx,str4
mov ah,9
int 21h;显示输出'the input error!'
jmp start;并跳转回start重新输入

transbin:
mov ah,0;保证ax中保存的是输入的值
mov cl,4
shl bx,cl;将上次的低四位移到高四位
add bx,ax;bx=bx+ax
mov bin,bx;将bx的值存入以bin为偏移地址的内存中
jmp input;返回input输入下一个数字字符

en:;转换十进制前的准备
mov ax,bin;将bin中的二进制数传送给ax
mov bx,10;bx=10,
mov si,5;si=5

transdec:;转十进制入口
mov dx,0;dx=0
div bx;ax除以bx,商放在ax,余数放在dx,每一次相除得到的余数即相应十进制数的每一位数
mov [buf+si],dl;将每一次相处得到的余数存在以偏移地址buf开头的一段内存中
sub si,1;每存一次余数,si--,使得下一次余数存储在更高位的内存单元
ja transdec;当si>0时,跳转到transdec标号;当si=0时,继续往下执行


lea dx,str2
mov ah,9
int 21h;显示输出'the dec number:'

outputdec:;十进制输出入口
inc si;si++,使得第一次指向十进制的最高位数
mov dl,[buf+si];将余数取出传送给dl
add dl,30h;dl=dl+30h,得到数字对应的数字字符
mov ah,2
int 21h;显示输出数字字符
cmp si,5
jb outputdec;当si<5时,跳转到outputdec标号继续输出显示十进制;否则继续向下执行

jmp start;跳转回start标号重新输入


MOV AH,4CH
INT 21H
CODES ENDS
END START

(3)实验代码、过程、相应结果(截图)并对实验进行说明和分析

目前只支持最高四位数的十六进制转十进制:

img

2. 判断闰年

(1)流程图

img

(2)汇编源代码

代码老师已经给了。

(3)实验代码、过程、相应结果(截图)并对实验进行说明和分析

自行运行代码测试。

3. 两个十进制数相加

(1)实验流程图

img

(2)汇编源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
DATAS SEGMENT
num1 db 'Please input a number: $'
num2 db 'Please input another number: $'
num3 db 'The sum of two numbers: $'
cr db 10,13,'$'
er db 'The input error!',13,10,'$'
bin1 dw 10 dup(?)
buf1 db 6 dup(0)
bin2 dw 10 dup(?)
DATAS ENDS

CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
lea dx,num1
mov ah,9
int 21h
mov bx,0
input1:
mov ah,1
int 21h

cmp al,13
je cn

sub al,30h
jb error
cmp al,10
jb transbin1
jmp error

transbin1:
mov ah,0
mov cl,4
shl bx,cl
add bx,ax
mov bin1,bx
jmp input1

cn:
mov bx,0
lea dx,num2
mov ah,9
int 21h

input2:
mov ah,1
int 21h

cmp al,13
je en

sub al,30h
jb error
cmp al,10
jb transbin2
jmp error

transbin2:
mov ah,0
mov cl,4
shl bx,cl
add bx,ax
mov bin2,bx
jmp input2


error:
lea dx,er
mov ah,9
int 21h
jmp start

en:;转换十进制前的准备
mov ax,bin1
add ax,bin2 ;将bin中的二进制数传送给ax
mov bx,16;bx=16
mov si,5;si=5

transdec:
mov dx,0
div bx
cmp dl,10
jb next
sub dl,10
add [buf1+si-1],1
next:
add [buf1+si],dl
sub si,1
ja transdec

lea dx,num3
mov ah,9
int 21h

output:
inc si
mov dl,[buf1+si]
add dl,30h

mov ah,2
int 21h
cmp si,5
jb output

lea dx,cr
mov ah,9
int 21h

MOV AH,4CH
INT 21H
CODES ENDS
END START

(3)实验记录

img

该程序目前不能完成有十六进制相加时有进位的情况。