【汇编】求十进制数的补码并转二进制和十六进制输出
【汇编】求十进制数的补码并转二进制和十六进制输出
(多组输入输出,使用宏库文件)
代码如下,有详细注释
Include macro_lib.MAC
data segmentstring db 10,?,10 dup(?) ;用于存放输入的十进制数 这里十进制数在-32768~32767之间(16位有符号数);可以出现负数,此程序功能为用二进制和十六进制显示这个十进制数的补码
data endscode segmentassume cs:code ,ds:data;输入多个十进制数,输入q字符(ascii码为113)结束程序
start:sta: inputs string ;调用宏指令库中的输入字符串crlf ;回车换行;第一位有三种情况 ;1.0~9 转正数处理 ascii码为48~57;2.'-' 转负数处理 ascii码为45;3.'q' 退出 ascii码为113;下面取第一位lea bx,stringadd bx,2mov cl,[bx] ;借助clcmp cl,113JZ ex ;如果ZF=1,即输入为q则结束程序cmp cl,45JZ nega ;如果ZF=1,即输入为负数;bx是string 的偏移地址
;正数,没有跳ex和nega
posi:
sub bx,2
mov cx,0
mov cl,[bx+1];cx存放实际串长
;cx+1指向串最后一位
mov ax,1;初始权值为1
mov bx,0;bx存放值
mov dx,10;常量
lp1:
push dx
mov dh,0;高位置0
push bx
mov bx,cx
mov dl,[bx+1];将当前位置的ascii码给dl,由于是数字为48~57
pop bx
sub dl,48;转为数值,dx为数字
push ax;保留当前权值
mul dx;数字乘以当前权值,结果低位在ax中,高位在dx中,即dx这里会被0覆盖(数比较小)
;但没关系,会pop,即只有ax的数值有用
add bx,ax
pop ax
mov dx,10;
mul dx
pop dx ;dx再恢复10 此时ax权值已经在以前基础上*10了
loop lp1 ;loop进行前会对cx--,不为零则循环
;循环结束,bx为所求值,由于正数的补码是其本身,下面直接输出二进制和十六进制即可;2进制
mov cx,16;循环16次
shift1:
rol bx,1
mov al,bl
and al,01h ;取最右1位
add al,30h ;转为ascii码
putchar al ;输出al中的ascii码对应的字符 0/1
loop shift1 ;循环16次后bx不变
put3space ;输出3个空格
;16进制
mov cx,4;循环4次
shift2:
rol bx,1
rol bx,1
rol bx,1
rol bx,1
mov al,bl
and al,0fh ;取最右四位
add al,30h ;转为ascii码
cmp al,39h
jle dig1 ;是0~9 则转dig
add al,7 ;是A~F
dig1:
putchar al ;输出al中的ascii码对应的字符
loop shift2 ;循环4次后bx不变
;输出回车换行
crlf
jmp sta;再次输入;负数
nega:
sub bx,2
mov cx,0
mov cl,[bx+1];cx存放实际串长
dec cx
;cx+2指向串最后一位
mov ax,1;初始权值为1
mov bx,0;bx存放值
mov dx,10;常量
lp2:
push dx
mov dh,0;高位置0
push bx
mov bx,cx
mov dl,[bx+2];将当前位置的ascii码给dl,由于是数字为48~57
pop bx
sub dl,48;转为数值,dx为数字
push ax;保留当前权值
mul dx;数字乘以当前权值,结果低位在ax中,高位在dx中,即dx这里会被0覆盖(数比较小)
;但没关系,会pop,即只有ax的数值有用
add bx,ax
pop ax
mov dx,10;
mul dx
pop dx ;dx再恢复10 此时ax权值已经在以前基础上*10了
loop lp2 ;loop进行前会对cx--,不为零则循环
;循环结束,bx为所求值的正直,下面求其补码,并以二进制和十六进制输出
;由于是负数,所以其补码是各位取反 由于高位是0 所以也要取反 所以
;各位异或1
xor bx,0FFFFH
add bx,1
;现在bx为补码了,下面直接输出二进制和十六进制即可;2进制
mov cx,16;循环16次
shift3:
rol bx,1
mov al,bl
and al,01h ;取最右1位
add al,30h ;转为ascii码
putchar al ;输出al中的ascii码对应的字符 0/1
loop shift3 ;循环16次后bx不变
put3space ;输出3个空格
;16进制
mov cx,4;循环4次
shift4:
rol bx,1
rol bx,1
rol bx,1
rol bx,1
mov al,bl
and al,0fh ;取最右四位
add al,30h ;转为ascii码
cmp al,39h
jle dig2 ;是0~9 则转dig
add al,7 ;是A~F
dig2:
putchar al ;输出al中的ascii码对应的字符
loop shift4 ;循环4次
;输出回车换行
crlf
jmp sta;再次输入ex: mov ah,4chint 21h
code endsend start
macro_lib.MAC
cr equ 13
lf equ 10
spa equ 32
getchar macromov ah,1int 21h ;al为输入字符endm
putchar macro asc mov ah,2mov dl,asc;输出dl上的字符int 21hendm
inputs macro conbuf mov ah,10mov dx,offset conbuf ;ds:dx为缓冲区的首地址 其分别存放缓冲区大小(字节数)、实际填充数、串内容int 21hendm
prints macro msgmov ah,9mov dx,offset msg; DS:DX为串地址,字符串应以'$'结尾int 21hendm
crlf macroputchar cr ;回车19d 13H putchar lf ;换行16d 10Hendmput3space macroputchar spaputchar spaputchar spaendmexit macro mov ah,4chint 21hendm
运行效果截图
【汇编】求十进制数的补码并转二进制和十六进制输出相关推荐
- 编写一个C程序,实现以下功能:编写一个函数decTobin(int n),该函数能将一个十进制数n转换成二进制数,输入13 输出 1101。在main函数中输入整数n,调用函数,输出它的二进制
题目要求: 编写一个C程序,实现以下功能: //编写一个函数decTobin(int n),该函数能将一个十进制数n转换成二进制数,输入13 输出 1101. //在main函数中输入整数n,调用函数 ...
- java十进制转二进制(输入一个十进制数将其转换成二进制)
十进制数转二进制数,跟据不同的开发语言其转换方式有很多,在Java中如果相把一个十进制的整数来转换成二进制那是举手之劳,非常简单,只要用Integer.toBinaryString(int)方法就可以 ...
- c语言中八进制转换成十进制数,C语言中的二进制、八进制、十进制之间的转换...
满意答案 郈广瑞2 2015.07.10 采纳率:53% 等级:8 已帮助:362人 你这个要求源代码比较麻烦,网上比较多的,数据结构要多看看了,比较好实现的方法,是利用栈.十进制转为二进制,你 ...
- 十进制数的原码 c语言,C语言程序设计第1章节(zmy).ppt
C语言程序设计第1章节(zmy).ppt 张茂元 副教授, 硕士生导师, 博士后 华中科技大学计算机学院 2007年2月;C语言程序设计-第1章 概论;1.1 学习C语言程序设计的第一个例子 ;例1. ...
- [Swift]LeetCode1009. 十进制整数的补码 | Complement of Base 10 Integer
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...
- 十进制数与N进制数据的转换
十进制数与N进制数据的转换 问题描述:将从键盘输入的十进制数转换为N(如二进制.八进制.十六进制)进制数据. #include<iostream> using namespace std; ...
- c语言计算十进制转八进制,C语言 十进制数转换八进制 算法
方法一:直接使用控制字符串 %o 八进制%x 方法二: 求余来算,比如求十进制数 x(x>100) 的8进制,先通过 x%8 可以得到个位(末位)上的数,当十进制数等于8时,必然会进位,求 ...
- 对于一个十进制数A,将A转换为二进制数,然后按位逆序排列,再转换为十进制数(Java)
package Four; /**题目描述* 对于一个十进制数A,将A转换为二进制数,然后按位逆序排列,再转换为十进制数* B就是A的二进制逆序数* 输入一个1000位以内的十进制整数 * */imp ...
- 汇编——十进制数据输入转二进制/十六进制输出(含数字判断,不限位数)
题目描述 输入一串十进制数,需要判断是否为数字,并将其转化成二进制和十六进制输出. 代码: 二进制: ;description data SEGMENTdata ENDS ;description s ...
最新文章
- 小米数据管理与应用实践
- 【Python】【函数式编程】
- SQL中的重复记录操作
- Linux-sort排序
- 超大Sql文件_超大文件_mysql数据导入到mycat数据库_亲测好用---Linux运维工作笔记053
- 开始gentoo之旅
- matlab中用数据拟合圆心,拟合圆并求圆心(matlab)
- 【2020团体程序设计天梯赛】L2-3 完全二叉树的层序遍历(后序遍历转层次遍历)
- 1036 跟奥巴马一起编程
- nohup命令简单的使用
- Neo4j Louvain算法
- OPPO小布助手算法系统探索、实践与思考
- php poedit怎么debug,php – 如何使PoEdit正确解析自定义“ngettext”实现?
- CATIA飞机协同设计制造图形工作站配置方案
- Proxmox VE桌面虚拟化
- Brave浏览器设置默认搜索引擎为百度
- 网页实现excel下载
- k8s查看集群信息及基本命令
- 图像三维重建方法综述
- 最新阿里P7技术体系:快来看看这些方案,你不懂还不学?