算法是代码的灵魂 ,了解代码才能触类旁通
显示二进制的算法
:在我的上一篇博客里面已经写了
显示十进制的算法
:在汇编中我们可以将该数除以10得到商和余数分别存到相应的容器中汇编提供了很多潜规则的指令
1,在C中我们想到显示商和余数时,我们不得不写两行代码 ,一行得出商,一行得出余数。
1: a: 对于字节除(div)来说一般默认商存在AL中,余数存在AH中,对于字除来说,一般默认商存在ax中,余数存在dx中。
b: loop 指令 当运行到loop时,计算机内部会进行cx-1然后与0比较,如果大于0,跳转到标号的位置继续循环,如果等于0,则退出循环
c: cmp指令,比较产生的结果,影响转移指令的运行cmp dl,39h
jbe t2
jbe指令:当cmp运行的结果小于等于0时跳转到标号t2的位置。不过jbe是针对无符号数来说的。具体查看条件转移指令
显示16进制的算法
:比如数据145eh
其在计算机内部的显示形式是0001010001011110
(BCD
码的形式)将数据循环左移四位(注,左移如果这样写会出错,rol bx,4不能一下子将bx循环左移四位,这样写rol bx,1 rol bx,1 rol bx,1 rol bx,1
也可以设置个循环形式)。具体显示变化如下图
;数据段
data segment
dat1 dw 145eh
data ends
;代码段
code segment
assume ds:data,cs:code
start:
mov ax,data
mov ds,ax;将数据段传进数据寄存器ds中
mov bx,dat1;将数据存入bx容器中
mov cx,16;设置循环次数
t:
rol bx,1;左移一位
mov dl,bl;将bx低八位存到dx的低八位中
and dl,01h;将dl的其它位置0这得出的是ASCII结果存在dl中
add dl,30h;将ascii转化为二进制
mov ah,02h
int 21h
loop t
mov dl,0dh
mov ah,02h
int 21h
mov dl,0ah;换行操作
mov ah,02h
int 21h
mov ax,data
mov ds,ax
mov bx,dat1
xor cx,cx;初始化cx为0
mov cx,4
t1:
rol bx,1
rol bx,1
rol bx,1
rol bx,1;左移四位
mov dl,bl;将bx的低八位送到dx的低八位中
and dl,0fh;
add dl,30h;转化为十进制的数
cmp dl,39h;和39h比较输出a-f
jbe t2
add dl,7
t2:
mov ah,02h
int 21h
loop t1
mov dl,'h'
mov ah,02h
int 21h
mov dl,0dh;回车
mov ah,02h
int 21h
mov dl,0ah;换行
mov ah,02h
int 21h
mov ax,data
mov ds,ax
mov bx,dat1
xor cx,cx;cx初始化为0
mov ax,bx;将数据存放到ax默认的数据寄存器中
mov bx,10;做除数
t3:
mov dx,0;入栈前先要把dx初始化为0
div bx;
push dx;
inc cx;
cmp ax,0
jnz t3;
t4:
pop dx;
add dl,30h
mov ah,02h
int 21h
loop t4
mov dl,0dh
int 21h
mov dl,0ah
int 21h
mov ah,4ch;返回dos
int 21h
code ends
end start
显示结果如下图