【汇编】求十进制数的补码并转二进制和十六进制输出

(多组输入输出,使用宏库文件)

代码如下,有详细注释

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

运行效果截图

【汇编】求十进制数的补码并转二进制和十六进制输出相关推荐

  1. 编写一个C程序,实现以下功能:编写一个函数decTobin(int n),该函数能将一个十进制数n转换成二进制数,输入13 输出 1101。在main函数中输入整数n,调用函数,输出它的二进制

    题目要求: 编写一个C程序,实现以下功能: //编写一个函数decTobin(int n),该函数能将一个十进制数n转换成二进制数,输入13 输出 1101. //在main函数中输入整数n,调用函数 ...

  2. java十进制转二进制(输入一个十进制数将其转换成二进制)

    十进制数转二进制数,跟据不同的开发语言其转换方式有很多,在Java中如果相把一个十进制的整数来转换成二进制那是举手之劳,非常简单,只要用Integer.toBinaryString(int)方法就可以 ...

  3. c语言中八进制转换成十进制数,C语言中的二进制、八进制、十进制之间的转换...

    满意答案 郈广瑞2 2015.07.10 采纳率:53%    等级:8 已帮助:362人 你这个要求源代码比较麻烦,网上比较多的,数据结构要多看看了,比较好实现的方法,是利用栈.十进制转为二进制,你 ...

  4. 十进制数的原码 c语言,C语言程序设计第1章节(zmy).ppt

    C语言程序设计第1章节(zmy).ppt 张茂元 副教授, 硕士生导师, 博士后 华中科技大学计算机学院 2007年2月;C语言程序设计-第1章 概论;1.1 学习C语言程序设计的第一个例子 ;例1. ...

  5. [Swift]LeetCode1009. 十进制整数的补码 | Complement of Base 10 Integer

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...

  6. 十进制数与N进制数据的转换

    十进制数与N进制数据的转换 问题描述:将从键盘输入的十进制数转换为N(如二进制.八进制.十六进制)进制数据. #include<iostream> using namespace std; ...

  7. c语言计算十进制转八进制,C语言 十进制数转换八进制 算法

    方法一:直接使用控制字符串    %o 八进制%x 方法二: 求余来算,比如求十进制数 x(x>100) 的8进制,先通过 x%8 可以得到个位(末位)上的数,当十进制数等于8时,必然会进位,求 ...

  8. 对于一个十进制数A,将A转换为二进制数,然后按位逆序排列,再转换为十进制数(Java)

    package Four; /**题目描述* 对于一个十进制数A,将A转换为二进制数,然后按位逆序排列,再转换为十进制数* B就是A的二进制逆序数* 输入一个1000位以内的十进制整数 * */imp ...

  9. 汇编——十进制数据输入转二进制/十六进制输出(含数字判断,不限位数)

    题目描述 输入一串十进制数,需要判断是否为数字,并将其转化成二进制和十六进制输出. 代码: 二进制: ;description data SEGMENTdata ENDS ;description s ...

最新文章

  1. 小米数据管理与应用实践
  2. 【Python】【函数式编程】
  3. SQL中的重复记录操作
  4. Linux-sort排序
  5. 超大Sql文件_超大文件_mysql数据导入到mycat数据库_亲测好用---Linux运维工作笔记053
  6. 开始gentoo之旅
  7. matlab中用数据拟合圆心,拟合圆并求圆心(matlab)
  8. 【2020团体程序设计天梯赛】L2-3 完全二叉树的层序遍历(后序遍历转层次遍历)
  9. 1036 跟奥巴马一起编程
  10. nohup命令简单的使用
  11. Neo4j Louvain算法
  12. OPPO小布助手算法系统探索、实践与思考
  13. php poedit怎么debug,php – 如何使PoEdit正确解析自定义“ngettext”实现?
  14. CATIA飞机协同设计制造图形工作站配置方案
  15. Proxmox VE桌面虚拟化
  16. Brave浏览器设置默认搜索引擎为百度
  17. 网页实现excel下载
  18. k8s查看集群信息及基本命令
  19. 图像三维重建方法综述
  20. 最新阿里P7技术体系:快来看看这些方案,你不懂还不学?

热门文章

  1. 免费一键领取7天绿钻领取源码
  2. Python入门习题大全——剔除人名中的空白
  3. Photoshop入门与进阶实例:1.4 图层的概念和基本操作
  4. 为什么你的生产效率始终那么低?生产计划排程是关键!
  5. MySQL通配符过滤
  6. python字符串格式化、运算符优先级、进制转化、编码回顾
  7. NC6 颜色标识常量类
  8. 基于Docker快速部署Zabbix
  9. github上有趣的内容
  10. 王者荣耀登录的服务器一直会显示吗,王者荣耀默认隐身上线,王者荣耀会显示离线时间吗...