这是代码的初稿,功能实现了,但是结构化上面感觉不是太满意,用了较多的内存交换数据的方式,移植性不太好(谁说汇编要可移植的)。重新写了一个防止溢出的除法,被除数是word型的,好了,贴代码:
复制代码
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
88assume cs:code,ds:data,ss:stack data segment db 16 dup (0) ;前两个字节保存除法的商,第三个自己是余数,第四第五个字节为字符个数 db 16 dup (0) data ends stack segment db 128 dup (0) stack ends code segment start: mov ax,stack mov ss,ax mov sp,128 mov ax,data mov ds,ax mov si,0 mov ax,12666 ;要转化为字符串的数 call dtoc mov ax,4c00h int 21h dtoc: push ax push cx push bx push si mov bl,0ah mov si,0 s0: call divw mov ah,ds:[2] ;从内存区取余数 add ah,30h mov [si+16],ah ;将余数变为字符后存入内存 inc si mov cx,ds:[0] ;从内存中取商,判断商是否为0 jcxz tran_ok mov ax,cx ;将商赋给ax,准备下一次除法 inc cl ;若值为1,则还要进行一次循环 loop s0 tran_ok: dec si mov ds:[3],si ;保存字符个数 call reverse ;转换字符顺序 pop si pop bx pop cx pop ax ret reverse: ;名称:reverse ;功能:将内存区一段字节逆序 ;参数: ;返回: push bx push ax push cx push si mov bx,0 mov ax,ds:[3] mov cl,2 div cl mov cl,al mov ch,0 s1: mov al,[bx+16] mov ah,[si+16] mov [bx+16],ah mov [si+16],al inc bx dec si loop s1 pop si pop cx pop ax pop bx ret
复制代码
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;reverse子程序到此结束 divw: ;名称:divw ;功能:进行不会产生溢出的除法运算, ; 被除数为word型,除数为byte ; 型,结果为word型。 ;参数:(ax)=word型数据的16位 ; (cl)=除数 ;返回:(ah)=结果的高8位 ; (al)=结果的低8位 ; (cl)=余数 push ax push dx push cx push bx push si mov dh,ah ;被除数高8位 mov dl,al ;被除数低8位 mov al,ah ;计算H/N mov ah,0 mov cl,bl ;参数传递? div cl ;(ah)=余数,(al)=商 mov bl,al ;bl暂存计算结果的商 mov al,dl div cl mov cl,ah ;保存余数 mov ah,bl ;商高位 mov ds:[0],ax ;向内存输出结果 mov ds:[2],cl divw_ok: pop si pop bx pop cx pop dx pop ax ret ;divw子程序到此结束 code ends end start
最后
以上就是孝顺芝麻最近收集整理的关于数字转字符串 基于8086汇编的全部内容,更多相关数字转字符串内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复