首页 > 编程语言 >【8086汇编】用栈来分解并显示数字

【8086汇编】用栈来分解并显示数字

时间:2024-10-26 16:19:14浏览次数:7  
标签:汇编 8086 xor di ah mov al 用栈 ax

1.源代码

数字范围:0~255

   xor ax,ax
   xor bx,bx
   xor cx,cx
   xor dx,dx
   mov al,163
   mov bh,10
s1:div bh
   add ah,0x30
   mov dl,al
   mov al,7
   xchg ah,al
   push ax
   mov al,dl
   xor ah,ah
   inc cx
   cmp al,0
   jne s1
   
   mov ax,0xb800
   mov es,ax
   xor di,di
   
s2:pop word es:[di]
   add di,2
   loop s2
   
   jmp $
   times 510-($-$$) db 0
   db 0x55,0xaa    

注:xchg ah,al这一指令非常关键

nasm编译成bin文件,再写入vhd文件,用VirtualBox执行

点我下载编译后的bin文件

2.运行效果

51a7d56b3dd848e5b755014f2216d479.png

3.分析

1.初始的四行用于初始化ax,bx,cx,dx寄存器

   xor ax,ax
   xor bx,bx
   xor cx,cx
   xor dx,dx

2.al存储要分解的数字,bh存储div 8位src的除数

   mov al,163
   mov bh,10

3.div 8位src ,al存储商,ah存储余数,将al+0x30转换为ASCII码,由于之后要将ax入栈,

因此mov dl,al中dl将al的值暂存,再为al赋值7(按8086RGB的规则,为黑底白字)

s1:div bh
   add ah,0x30
   mov dl,al
   mov al,7

4.xchg ah,al是用来交换ah,al寄存器的值(exchange),因为push ax对应的是pop word es:[di],

由栈来看,ax的al要存储字符的ASCII码(余数+30h),ah要存储字符的属性,但div执行后al存储商,ah存储余数,因此需要交换al和ah中的数值,因此使用xchg指令

   xchg ah,al
   push ax
   mov al,dl
   xor ah,ah
   inc cx

5.ax入栈后,从dl寄存器中恢复al的值,为ah清零,cx+1,记录之后按word出栈的次数

   push ax
   mov al,dl
   xor ah,ah
   inc cx

6.比较al是否为0,不为0则继续除10(jne s1)

   cmp al,0
   jne s1

7.设置es:di指向显存区第0页的第一个字节

   mov ax,0xb800
   mov es,ax
   xor di,di

8.s2循环是为了写入显存区

s2:pop word es:[di]
   add di,2
   loop s2

9.剩余的三个指令用00来填满主引导扇区,以55 AA结尾

   jmp $
   times 510-($-$$) db 0
   db 0x55,0xaa    

标签:汇编,8086,xor,di,ah,mov,al,用栈,ax
From: https://blog.csdn.net/2401_85828611/article/details/143226217

相关文章

  • 2:ARM 汇编语言2:二进制/十进制/十六进制
    2.1对于几大进制的介绍2.1.1从十进制开始(decimalsystem)十进制是啥,看起来感觉很生僻,一看就是一个高大上的词语,但是这个的含义就是我们常用的数字的规则,简洁的说就是十进一的含义,10(个位上是十,然后往十位进一,所以就是10),所以十位就是10**1 10=1*10**1+0*10**0,答案就是10......
  • 编写汇编代码最好的IDE是什么
    最好的IDE取决于你的使用场景和个人偏好,但值得推荐的有:1.VisualStudio;2.NASM;3.MASM;4.RadASM;5.IDAPro。其中,对于需要高级调试工具和库资源的开发者而言,VisualStudio可能是最佳选择;而对于初学者和教育用途,NASM则提供了一个简单的学习平台。1.VisualStudioVisualStudi......
  • 【汇编语言】标志位和转移指令
    ##1.标志位   ZF:上一步操作是否为0,是(ZF=1),否(ZF=0);           在DEBUG中,是(ZR),否(NZ)。   OF:上一步操作是否溢出,是(OF=1),否(OF=0);           在DEBUG中,是(OV),否(NV)。   SF:上一步操作结果是否为负,负(SF=1),正(SF=......
  • 王爽汇编实验12
    下面是实验十二的代码assumecs:codecodesegmentstart: ;do0的安装程序,只需要安装一次,以后无需此步骤 movax,cs movds,ax movsi,offsetdo0 ;设置ds:si指向do0程序所在位置 movax,0 moves,ax movdi,200h ;设置es:di指向中断......
  • 汇编语言
    寄存器RIP存放下一条指令的偏移地址RSP存放当前栈帧的栈顶偏移地址RBP存放当前栈帧的栈底偏移地址RAX通用寄存器。存放函数的返回值汇编实际中执行指令时,EIP已经移动到下一行了cmp语句cmpa1,0x61suba1,0x61本质a1-0x61a1=a1-0x61不同a1不会赋值a1......
  • 232. 用栈实现队列
    classMyQueue{public:MyQueue(){}voidpush(intx){s1.push(x);}intpop(){intret;if(!empty()){if(!s2.empty()){ret=s2.top();s2.pop();......
  • 【记录】arm64体系结构下写golang plan9汇编,怎么查有哪些指令?
    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!cnblogs博客zhihuGithub公众号:一本正经的瞎扯方法1:看源码github.com/golang/go/src/cmd/internal/obj/arm64/anames.go:这个位置有所有arm64体系下支持的指令方法2:上述代码生成的文档位置:https://go.......
  • 汇编语言学习笔记(一)基础知识
    指令和数据指令和数据是应用上的概念,在内存或磁盘上,两者没有任何区别,都是二进制信息。如同围棋中的棋子,在棋盒里没有任何区别,在对弈的时候才有不同的意义存储单元计算机最小信息单位为Bit,也就是一个二进制位。8个bit组成一个Byte.通常称之为字节1B=8Bit,1KB=1024B,1M=1024......
  • 汇编语言学习笔记(二)寄存器
    简介上文所说的总线,相对于CPU自身而言,属于外部总线。这些外部总线将CPU与外部芯片串联起来。其内部也有类似结构(运算器/控制器/寄存器/内部总线),组成一个完整的CPU。运算器进行计算处理寄存器进行数据存储控制器控制内部芯片内部总线串联内部芯片不同CPU,寄存器的数量与......
  • 简单汇编教程9 字符串与字符串指令
    目录字符串的指令movs字符串传送lods,stos使用cmpsb的使用SCASB的使用字符串你很熟悉了,我们定义了无数次了!%macroANNOUNCE_STRING2 %1db%2 %1_LENequ$-%1%endmacro当然,我们现在来学习一个比较新的定义方式,那就是跟C语言一样安插一个哨兵字符\0......