[汇编] 十进制与十六进制互转

简介:


 

 

复制代码
  1 ;程序设计的要求:通过键盘给一个四位的16进制数,程序把它转换成10进制数,并显示出来。
  2 ;把输入的4位16进制数以10十进制的值存放到变量num中,注意num可能会有5位数。所以下面
  3 ;就通过÷,%(10000,1000,100,10)来得到每一位数,即十进制数.  
  4 ;相同的道理,把num转换为16进制
  5 DSEG SEGMENT
  6     ;数据段:在此处添加程序所需的数据
  7     num dw ?
  8     arr dw 10 dup(?) 
  9     STRING1  DB  '[choce 0 (dec->hex) or 1 (hex->dec)]:$'      
 10     STRING2  DB  '[input a hex number which must be four digits]:$'
 11     STRING3  DB  '[input a dec number which must be four digits]:$'
 12 DSEG ENDS 
 13 
 14 CSEG SEGMENT
 15 ;***************************************************************************
 16 MAIN PROC FAR          ;主程序入口 
 17     assume  cs:CSEG, ds:DSEG          
 18 ;---------------------------------------------------------------------------
 19 chose:   
 20     mov ax, DSEG
 21     mov ds, ax
 22     mov es, ax
 23 
 24     lea dx, STRING1
 25     mov ah, 9
 26     int 21h         ; output string at ds:dx 
 27     
 28     mov ah, 01h     ;键盘输入并回显,AL=input char
 29     int 21h
 30     cmp al,30h      ;和'0'比较
 31     je  start2      ;转到10-16进制入口
 32     cmp al,31h      ;和'1'比较
 33     je  start1      ;转到16-10进制入口  
 34     call change     ;换行,重新选择
 35     jmp chose       ;输入错误,让其重新输入
 36 ;---------------------------------------------------------------------------
 37 start1:             ;4位16进制转10进制,入口
 38        call change     ;自动换行
 39        
 40     lea dx, STRING2
 41     mov ah, 9
 42     int 21h         ; output string at ds:dx 
 43     
 44     mov num, 0
 45     mov cx, 4        ;输入4位16进制数(这里没有处理少于或多于4位的情况)
 46 L1:    mov ah, 01h     ;键盘输入并回显,AL=input char
 47     int 21h
 48     push cx         ;保护cx
 49     mov cl, 4
 50     shl num, cl        ;输入的数以10进制的形式存到num中[逻辑左移4位,SHL OPR,CNT 前一个不能是操作数,后一个为CL寄存器]
 51     pop cx
 52 
 53     cmp al, 3ah     ;<9直接al-'0'扩展->num->bx
 54     jb s1
 55     cmp al,47h      ;9< <G  [小写的大于大写的]
 56     jb x1 
 57     sub al,20h      ;小写的比大写的多减去20h
 58 x1:    sub al, 7h
 59 s1:    sub al, 30h
 60     mov ah, 0
 61     add num, ax
 62     mov bx, num
 63     loop L1  
 64 solve1:
 65     call change     ;自动换行
 66     call fun1        ;调用主函数
 67     call change
 68     jmp  chose
 69     call exit        ;退出
 70 ;--------------------------------------------------------------------------     
 71 start2:   
 72     call change     ;自动换行
 73        
 74     lea dx, STRING3
 75     mov ah, 9
 76     int 21h         ; output string at ds:dx 
 77     
 78     mov num, 0
 79     mov cx, 4        ;输入4位16进制数(这里没有处理少于或多于4位的情况)
 80 L2:    mov ah, 01h     ;键盘输入并回显,AL=input char
 81     int 21h
 82     push cx         ;保护cx  
 83     push ax
 84     mov cx,10d  
 85     mov ax,num      ;字乘法:(dx,ax)=ax*src
 86     mul cx
 87     mov num,ax      ;把ax给num  
 88     pop ax
 89     pop cx
 90 s2:    sub al, 30h     ;输入转换为数字-'0'
 91     mov ah, 0
 92     add num, ax
 93     mov bx, num
 94     loop L2  
 95     jmp  solve2
 96 solve2:
 97     call change     ;自动换行
 98     call fun2        ;调用主函数
 99     call change
100     jmp  chose
101     call exit        ;退出     
102 ;******************************************************************************;
103 MAIN ENDP   
104 
105 fun1 proc           ;被除数放在dx中
106     mov cx, 10000d    ;把除数存放到cx中
107     call dec_div
108 
109     mov cx, 1000d
110     call dec_div
111     
112     mov cx, 100d
113     call dec_div
114     
115     mov cx, 10d
116     call dec_div
117     
118     mov cx, 1d
119     call dec_div
120     ret
121 fun1 endp        
122 
123 dec_div     proc    ;除法实现,除数为cx的值
124     mov ax, bx
125     mov dx, 0
126     div cx          ;div 无符号:div src 16位操作:商ax=(dx,ax)/src,余数dx
127     mov bx, dx
128     mov dl, al
129 
130     add dl, 30h     ;转换为char并显示
131     mov ah, 02h
132     int 21h
133     ret
134 dec_div    endp 
135 ;------------------------------------------------------------------------
136 fun2 proc           ;被除数放在dx中
137     mov cx,1000h    ;把除数存放到cx中
138     call hex_div
139 
140     mov cx,0100h
141     call hex_div
142     
143     mov cx,0010h
144     call hex_div
145     
146     mov cx,0001h
147     call hex_div
148     
149     ret
150 fun2 endp        
151 
152 hex_div     proc    ;除法实现,除数为cx的值
153     mov ax, bx
154     mov dx, 0
155     div cx          ;div 无符号:div src 16位操作:商ax=(dx,ax)/src,余数dx
156     mov bx, dx
157     mov dl, al
158     
159     cmp dl, 10d     ;和10比   >=10
160     jb show 
161     add dl,7h       ;>=10的情况
162 show:
163     add dl, 30h     ;转换为char并显示
164     mov ah, 02h
165     int 21h
166     ret
167 hex_div    endp
168 ;*************************************************************************************************
169 ;回车换行
170 change     proc
171     push ax
172     mov ah, 02h
173     mov dl, 0ah
174     int 21h
175     mov ah, 02h
176     mov dl, 0dh
177     int 21h
178     pop ax
179     ret
180 change    endp
181 ;*************************************************************************************************
182 ;退出
183 exit    proc
184     ;按任意键退出
185     mov ah,1
186     int 21h
187     mov ax, 4c00h  ;程序结束,返回到操作系统
188     int 21h
189 exit    endp
190 ;*************************************************************************************************
191 END MAIN   
192 CSEG ENDS
复制代码
相关文章
|
5月前
|
机器学习/深度学习 人工智能 自然语言处理
大模型
大模型正重塑数字世界,以千亿级参数和深度学习技术驱动AI革命。它赋能内容生成、智能交互与知识服务,同时带来伦理、隐私与能耗挑战。未来需走向高效、可信、向善的可持续发展之路。
java如何跳出for循环?
java跳出for循环的方法 break continue return break语句 break用于完全结束一个循环,跳出循环体。不管是哪种循环,一旦在循环体中遇到break,系统将完全结束循环,开始执行循环之后的代码。
14682 0
|
缓存 JavaScript 开发工具
【安装指南】VSCode搭建运行Vue的详细教程
【安装指南】VSCode搭建运行Vue的详细教程
4930 0
|
内存技术
Mac nvm 切换为淘宝镜像
Mac nvm 切换为淘宝镜像
1698 0
|
PHP 开发者
开源的建站系统
【4月更文挑战第24天】开源的建站系统
494 3
|
安全 Linux 网络安全
linux服务器木马排查
【4月更文挑战第18天】该文提供了服务木马排查的六个步骤:1) 检查系统日志,观察异常IP并用SSH防护,限制22端口和root用户;2) 查看系统用户,找寻异常或新创建的UID/GID为0的用户;3) 检查UID为0的进程和隐藏进程,防止恶意活动;4) 搜索异常大文件和具有特殊权限的文件;5) 检验系统计划任务的完整性;6) 使用rkhunter和chkrootkit检测rootkit。关键在于识别入侵点并采取相应措施。
506 0
|
算法 C语言
ADC常用的十大滤波算法(C语言)
ADC常用的十大滤波算法(C语言)
1174 0
|
Android开发 Java 数据格式
|
存储 Linux C语言
Linux获取文件信息的利器stat,fstat,lstat,fstatat
stat系列函数是C语言中的一个系统调用函数,用于获取文件的信息。通过提供文件路径,它能够返回包含文件属性的结构体数据。
657 0
|
Ubuntu
ubuntu 16.04 蓝牙鼠标 (可连接但是无法使用)
ubuntu 16.04 蓝牙鼠标 (可连接但是无法使用)
487 0