博客
关于我
8086汇编语言:数据的输出(带符号输出、二进制输出、八进制输出、十六进制输出)
阅读量:391 次
发布时间:2019-03-05

本文共 3024 字,大约阅读时间需要 10 分钟。

一、题目说明

将一个数据存入AX中,分别以有符号数、二进制、八进制、十六进制的形式输出。


二、逐步求解

从本质上来讲,计算机不会关心你存储的是何种形式的数,只是将其视为01的数字串。因此,从本质上讲,各种形式的输出其实是这些01串的不同解读。

目录

① 有符号数形式的输出

② 二进制形式的输出
③ 八进制形式的输出
④ 十六进制形式的输出

① 有符号数形式的输出

当我们以有符号数的形式查看计算机中存储的01串时,最高位默认成为了符号位,0代表正数,1代表负数。

方案一:借助移位操作,将最高位换到最低位,再借助逻辑运算指令(如AND)将除最低位之外的所有位置为0,从而获取最高位的值,确定正负号输出。

方案二:借助cmp指令,查看符号位SF(SF=1为负数,SF=0为正数)。cmp ax,0可以不改变原数值,js用于判断SF位的结果。

:以下代码使用方案二。


② 二进制形式的输出

方案一:借助循环移位操作(ROL),将最高位移到最低位,再借助逻辑运算指令剥离最后一位值,循环上述操作直到最后一位。

方案二:借助除法操作(DIV),每次将AX除以2,压栈存余数,直到AX为零,输出压栈数据。

:以下代码使用方案一。


③ 八进制形式的输出

方案一:借助循环移位操作(ROL),每次将高三位移到低三位,再借助逻辑运算指令剥离低三位值,循环上述操作直到最后三位。

方案二:借助除法操作(DIV),每次将AX除以8,压栈存余数,直到AX为零,输出压栈数据。

:以下代码使用方案二。


④ 十六进制形式的输出

方案一:借助循环移位操作(ROL),每次将高四位移到低四位,再借助逻辑运算指令剥离低四位值,循环上述操作直到最后四位。

方案二:借助除法操作(DIV),每次将AX除以16,压栈存余数,直到AX为零,输出压栈数据。

:以下代码使用方案一。


三、问题解答

为什么上面输入负数使用除法就不行了呢?

因为在输入负数后,AX中是补码形式存储,高位是1。除法操作会导致AH和AL溢出,进而报错。因此建议使用移位操作。


四、最终汇总代码

以下是完整的汇总代码示例:

DATAS SEGMENTCRLF DB 0AH,0DH,"$";回车换行string DB "The original value was:", "$"string1 DB "The binary form is:", "$"string2 DB "The octal number system is:", "$"string3 DB "The hexadecimal form is:", "$"DATAS ENDSSTACKS SEGMENTENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:lea dx, stringmov ah, 9int 21hmov ax, -123call symoutputlea dx, crlfmov ah, 9int 21hlea dx, string1mov ah, 9int 21hmov ax, -123call binaryoutputlea dx, crlfmov ah, 9int 21hlea dx, string2mov ah, 9int 21hmov ax, -123call octaloutputlea dx, crlfmov ah, 9int 21hlea dx, string3mov ah, 9int 21hmov ax, -123call hexadecimaloutputlea dx, crlfmov ah, 9int 21hMOV AH, 4CHINT 21H;以下是各个输出函数的实现symoutput procpush bxpush dxmov bx, axcmp ax, 0js negativejmp positivenegative:mov dl, '-'mov ah, 2int 21hneg bxcall outputjmp symoutputoverpositive:call outputsymoutputover:pop dxpop bxret symoutput endp;二进制输出函数binaryoutput procpush bxpush dxmov dh, 0binaryagain:cmp dh, 16je binaryoverrol ax, 1mov bx, axand ax, 0001hmov dl, aladd dl, 48mov ah, 2int 21hinc dhmov ax, bxjmp binaryagainbinaryover:pop dxpop bxret binaryoutput endp;八进制输出函数octaloutput procpush bxpush cxpush dxrol ax, 1mov bx, axand ax, 01hmov dl, aladd dl, 48mov ah, 2int 21hmov ax, bxjmp octalagainoctalagain:cmp dh, 5je octaloverinc dhmov cl, 3rol ax, clmov bx, axand ax, 07hmov dl, aladd dl, 48mov ah, 2int 21hmov ax, bxjmp octalagainoctalover:pop dxpop cxpop bxret octaloutput endp;十六进制输出函数hexadecimaloutput procpush bxpush cxpush dxmov dh, 0hexadecimalagain:cmp dh, 4je hexadecimaloverinc dhmov cl, 4rol ax, clmov cx, axand ax, 0fhmov dl, alcmp dl, 9ja alphabetadd dl, 48mov ah, 2int 21hmov ax, cxjmp hexadecimalagainalphabet:add dl, 55mov ah, 2int 21hmov ax, cxjmp hexadecimalagainhexadecimalover:pop dxpop cxpop bxret hexadecimaloutput endp;多位输出函数output procpush axpush cxpush dxmov ax, bxmov cl, 10mov ch, 0divagain:cmp ax, 0je divoverinc chdiv clpush axmov ah, 0jmp divagaindivover:cmp ch, 0je outputoverpop axmov dl, ahadd dl, 48mov ah, 2int 21hdec chjmp divoveroutputover:pop dxpop cxpop axret output endpCODES ENDSEND START

结论

通过以上代码,我们可以将数据以有符号数、二进制、八进制和十六进制的形式进行输出。每种形式的输出都通过不同的方法实现,确保了代码的高效性和可读性。

转载地址:http://hlmg.baihongyu.com/

你可能感兴趣的文章
opencv4-图像操作
查看>>
opencv5-图像混合
查看>>
opencv9-膨胀和腐蚀
查看>>
OpenCV与AI深度学习 | SAM2(Segment Anything Model 2)新一代分割一切大模型介绍与使用(步骤 + 代码)
查看>>
OpenCV与AI深度学习 | YOLO11介绍及五大任务推理演示(目标检测,图像分割,图像分类,姿态检测,带方向目标检测)
查看>>
OpenCV与AI深度学习 | 使用Python和OpenCV实现火焰检测(附源码)
查看>>
OpenCV与AI深度学习 | 使用YOLO11实现区域内目标跟踪
查看>>
OpenCV与AI深度学习 | 使用YOLOv8做目标检测、实例分割和图像分类(包含实例操作代码)
查看>>
OpenCV与AI深度学习 | 基于GAN的零缺陷样本产品表面缺陷检测
查看>>
OpenCV与AI深度学习 | 基于OpenCV和深度学习预测年龄和性别
查看>>
OpenCV与AI深度学习 | 基于Python和OpenCV将图像转为ASCII艺术效果
查看>>
OpenCV与AI深度学习 | 基于PyTorch实现Faster RCNN目标检测
查看>>
OpenCV与AI深度学习 | 基于PyTorch语义分割实现洪水识别(数据集 + 源码)
查看>>
OpenCV与AI深度学习 | 基于YOLO11的车体部件检测与分割
查看>>
OpenCV与AI深度学习 | 基于YOLOv8的停车对齐检测
查看>>
OpenCV与AI深度学习 | 基于机器视觉的磁瓦表面缺陷检测方案
查看>>
Opencv中KNN背景分割器
查看>>
OpenCV中基于已知相机方向的透视变形
查看>>
opencv之模糊处理
查看>>
opencv保存图片路径包含中文乱码解决方案
查看>>