【汇编】求十进制数的补码并转二进制和十六进制输出
来源:互联网 发布:mac opengl 编辑:程序博客网 时间:2024/05/19 20:56
【汇编】求十进制数的补码并转二进制和十六进制输出
(多组输入输出,使用宏库文件)
代码如下,有详细注释
Include macro_lib.MACdata segment string db 10,?,10 dup(?) ;用于存放输入的十进制数 这里十进制数在-32768~32767之间(16位有符号数) ;可以出现负数,此程序功能为用二进制和十六进制显示这个十进制数的补码data endscode segment assume 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,string add bx,2 mov cl,[bx] ;借助cl cmp cl,113 JZ ex ;如果ZF=1,即输入为q则结束程序 cmp cl,45 JZ nega ;如果ZF=1,即输入为负数;bx是string 的偏移地址;正数,没有跳ex和nega posi: sub bx,2mov cx,0mov cl,[bx+1];cx存放实际串长;cx+1指向串最后一位mov ax,1;初始权值为1mov bx,0;bx存放值mov dx,10;常量lp1:push dxmov dh,0;高位置0push bxmov bx,cxmov dl,[bx+1];将当前位置的ascii码给dl,由于是数字为48~57pop bxsub dl,48;转为数值,dx为数字push ax;保留当前权值mul dx;数字乘以当前权值,结果低位在ax中,高位在dx中,即dx这里会被0覆盖(数比较小);但没关系,会pop,即只有ax的数值有用 add bx,axpop axmov dx,10;mul dxpop dx ;dx再恢复10 此时ax权值已经在以前基础上*10了loop lp1 ;loop进行前会对cx--,不为零则循环;循环结束,bx为所求值,由于正数的补码是其本身,下面直接输出二进制和十六进制即可;2进制mov cx,16;循环16次shift1:rol bx,1mov al,bland al,01h ;取最右1位add al,30h ;转为ascii码putchar al ;输出al中的ascii码对应的字符 0/1loop shift1 ;循环16次后bx不变put3space ;输出3个空格;16进制mov cx,4;循环4次shift2:rol bx,1rol bx,1rol bx,1rol bx,1mov al,bland al,0fh ;取最右四位add al,30h ;转为ascii码cmp al,39hjle dig1 ;是0~9 则转digadd al,7 ;是A~Fdig1: putchar al ;输出al中的ascii码对应的字符loop shift2 ;循环4次后bx不变;输出回车换行crlfjmp sta;再次输入;负数nega:sub bx,2mov cx,0mov cl,[bx+1];cx存放实际串长dec cx;cx+2指向串最后一位mov ax,1;初始权值为1mov bx,0;bx存放值mov dx,10;常量lp2:push dxmov dh,0;高位置0push bxmov bx,cxmov dl,[bx+2];将当前位置的ascii码给dl,由于是数字为48~57pop bxsub dl,48;转为数值,dx为数字push ax;保留当前权值mul dx;数字乘以当前权值,结果低位在ax中,高位在dx中,即dx这里会被0覆盖(数比较小);但没关系,会pop,即只有ax的数值有用 add bx,axpop axmov dx,10;mul dxpop dx ;dx再恢复10 此时ax权值已经在以前基础上*10了loop lp2 ;loop进行前会对cx--,不为零则循环;循环结束,bx为所求值的正直,下面求其补码,并以二进制和十六进制输出;由于是负数,所以其补码是各位取反 由于高位是0 所以也要取反 所以;各位异或1xor bx,0FFFFHadd bx,1;现在bx为补码了,下面直接输出二进制和十六进制即可;2进制mov cx,16;循环16次shift3:rol bx,1mov al,bland al,01h ;取最右1位add al,30h ;转为ascii码putchar al ;输出al中的ascii码对应的字符 0/1loop shift3 ;循环16次后bx不变put3space ;输出3个空格;16进制mov cx,4;循环4次shift4:rol bx,1rol bx,1rol bx,1rol bx,1mov al,bland al,0fh ;取最右四位add al,30h ;转为ascii码cmp al,39hjle dig2 ;是0~9 则转digadd al,7 ;是A~Fdig2: putchar al ;输出al中的ascii码对应的字符loop shift4 ;循环4次;输出回车换行crlfjmp sta;再次输入ex: mov ah,4ch int 21hcode ends end start
macro_lib.MAC
cr equ 13lf equ 10spa equ 32getchar macro mov ah,1 int 21h ;al为输入字符 endmputchar macro asc mov ah,2 mov dl,asc;输出dl上的字符 int 21h endminputs macro conbuf mov ah,10 mov dx,offset conbuf ;ds:dx为缓冲区的首地址 其分别存放缓冲区大小(字节数)、实际填充数、串内容 int 21h endm prints macro msg mov ah,9 mov dx,offset msg; DS:DX为串地址,字符串应以'$'结尾 int 21h endmcrlf macro putchar cr ;回车19d 13H putchar lf ;换行16d 10H endmput3space macro putchar spa putchar spa putchar spa endmexit macro mov ah,4ch int 21h endm
运行效果截图
阅读全文
1 0
- 【汇编】求十进制数的补码并转二进制和十六进制输出
- 不能使用printf,将十进制数以二进制数和十六进制的形式输出...
- 汇编:将十进制或十六进制数转化成二进制数输出
- 不是用它printf,将十进制数以二进制和十六进制的形式输出
- 不是用它printf,将十进制数以二进制和十六进制的形式输出
- 汇编-十六进制转二进制输出
- 求若干个数的平均数并输出123456的二进制和十六进制
- 汇编语言:从键盘输入十进制数,输出该十进制数的十进制,二进制(B),十六进制(H),八进制(Q)表示
- 汇编语言(二):从键盘输入十进制数,输出该十进制数的十进制,二进制(B),十六进制(H),八进制(Q)表示
- 二进制数逆转,并以十进制输出
- 把十进制数(long型)分别以二进制和十六进制形式输出
- 把十进制数(long型)分别为二进制和十六进制形式输出,不能使用printf
- 把十进制数(long型)分别以二进制和十六进制形式输出,不能使用printf系列。
- 将十进制数转换为二进制数和十六进制数
- 十进制、二进制和十六进制
- 十进制-->十六进制和十进制-->二进制
- 将十进制数对应的八进制、十六进制、十进制数输出
- 将十进制数对应的八进制、十六进制、十进制数输出
- 最全的微信小程序代码大全
- 关于Maven多模块开发热修改的一点记录
- mongodb笔记04(MongoDB $type 操作符,Limit与Skip方法,sort()方法,索引,聚合(aggregate))
- 商品订单:数据的判断、添加,批量删除,排序,模糊查询
- Dropout浅层理解与实现
- 【汇编】求十进制数的补码并转二进制和十六进制输出
- NULL与String.Empty的
- php日期转中文程序代码
- 强制删除attached状态的screen
- ROI Pooling层解析_代码原理详细解释和存在目的
- qt:During startup program exited with code 0xc0000135
- 91. Decode Ways
- pycharm下载
- The Clean Architecture(清洁的架构风格)