Intel8086处理器使用NASM汇编语言实现操作系统07-以除法和BCD码两种方式显示10进制和16进制数字到屏幕/div/xor

本文主要是介绍Intel8086处理器使用NASM汇编语言实现操作系统07-以除法和BCD码两种方式显示10进制和16进制数字到屏幕/div/xor,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

div除法指令,这是我最烦的汇编指令之一了,它的写法在不同位数CPU上都是不一样的

div bh		;表示用AX里的值除以bh寄存器中的值;因为div后面接8位寄存器或者内存地址,商在AL寄存器中,余数在AH寄存器中
div bx		;表示用高16位在DX,低16位在AX里的值,除以bx寄存器中的值;因为div后面接16位寄存器或者内存地址,商在AX寄存器中,余数在DX寄存器中
div ebx		;表示用高32位在EDX,低32位在EAX里的值,除以ebx寄存器中的值;因为div后面接32位寄存器或者内存地址,商在EAX寄存器中,余数在EDX寄存器中
div rbx		;同理,对应64位的RDX和RAX

xor为异或指令,使用方式如下

xor ax,bx	;将ax与bx寄存器里的值进行异或操作,结果放到ax中;xor指令通常用来异或同一个寄存器,导致该寄存器;0
xor ax,ax	;例如这行代码,结果等于mov ax,0;不过效率上要快很多
xor byte [b800],666	;这样写也可以

下面是XOR的常见错误写法需要注意

xor ax,bh	;两个操作数长度不一样,这是错误的

下面的代码在屏幕显示十进制数字1102,原理是要将1102的每一位取出来,然后找到其对应的ascii码,再将ascii码写到显存地址0xB800处

mov ax,0xb800
mov ds,ax
;准备用10进制1102除以10进制1000,因为要用div指令,且除数我准备放到bx中,
;因为div后面接16位寄存器或地址,所以1102被看成32位数,高16在DX中,低16
;在AX中,1102没有那么大,所以只用ax,dx需要赋值0
mov dx,0			;16位置0
mov ax,0d1102		;16位存放1102即可
mov bx,0d1000		;将除数1000存到bx寄存器中,注意bx是16位寄存器
div bx				;执行出发,商1会放到AX寄存器中,余数102会放到DX中
add ax,0d48			;用ax中的商+48,则ax中的值变成了商的ascii码					
mov [0],ax
mov byte [1],0x0b   ;屏幕显示1102的第一个数字,也就是1mov ax,dx 			;将dx中的数字102放到ax中
mov dx,0			;16位置0
mov bx,0d100			
div bx				;10进制102除以100,商1放到ax中,余数2放到dx中
add ax,0d48
mov [2],ax
mov byte [3],0x0b   ;屏幕显示1102的第二个数字,还是1mov ax,dx 			;将dx中的数字2放到ax中
mov dx,0			;16位置0
mov bx,10
div bx				;10进制2除以10,商0放到AX中,余数2放到dx中
add ax,0d48
mov [4],ax
mov byte [5],0x0b   ;屏幕显示1102的第三个数字,也就是0mov ax,dx 			;将dx中的数字2放到ax中
xor dx,dx 			;16位置0
mov bx,1
div bx				;10进制2除以1,商2放到AX中,余数0放到dx中
add ax,0d48
mov [6],ax
mov byte [7],0x0b   ;屏幕显示1102的第四个数字,也就是2for:jmp for
times 510-($-$$) db 0x0
db 0x55
db 0xAA 

下面的代码是将16进制36以BCD码的方式保存到al寄存器,并在屏幕上显示36

mov  ax,0xb800			;设置显存基址为b800
mov  ds,ax				
mov  al,0x36			;传入16进制36的BCD码到al寄存器
call show_BCD_number
dont_stop:jmp dont_stop
show_BCD_number:
xor  bx,bx
mov  bl,al
shr  bl,4				;保留高4位
add  bl,48d				;BCD转换ASICC需要+48
mov  [0],bl
mov  byte [1],0x0band  al,0x0F
add  al,48d
mov  [2],al
mov  byte [3],0x0b
rettimes 510-($-$$) db 0
dw 0Xaa55

这篇关于Intel8086处理器使用NASM汇编语言实现操作系统07-以除法和BCD码两种方式显示10进制和16进制数字到屏幕/div/xor的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1057312

相关文章

Pandas使用SQLite3实战

《Pandas使用SQLite3实战》本文主要介绍了Pandas使用SQLite3实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1 环境准备2 从 SQLite3VlfrWQzgt 读取数据到 DataFrame基础用法:读

JSON Web Token在登陆中的使用过程

《JSONWebToken在登陆中的使用过程》:本文主要介绍JSONWebToken在登陆中的使用过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录JWT 介绍微服务架构中的 JWT 使用结合微服务网关的 JWT 验证1. 用户登录,生成 JWT2. 自定义过滤

Java中StopWatch的使用示例详解

《Java中StopWatch的使用示例详解》stopWatch是org.springframework.util包下的一个工具类,使用它可直观的输出代码执行耗时,以及执行时间百分比,这篇文章主要介绍... 目录stopWatch 是org.springframework.util 包下的一个工具类,使用它

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义

opencv图像处理之指纹验证的实现

《opencv图像处理之指纹验证的实现》本文主要介绍了opencv图像处理之指纹验证的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录一、简介二、具体案例实现1. 图像显示函数2. 指纹验证函数3. 主函数4、运行结果三、总结一、

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

Springboot处理跨域的实现方式(附Demo)

《Springboot处理跨域的实现方式(附Demo)》:本文主要介绍Springboot处理跨域的实现方式(附Demo),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录Springboot处理跨域的方式1. 基本知识2. @CrossOrigin3. 全局跨域设置4.

springboot security使用jwt认证方式

《springbootsecurity使用jwt认证方式》:本文主要介绍springbootsecurity使用jwt认证方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录前言代码示例依赖定义mapper定义用户信息的实体beansecurity相关的类提供登录接口测试提供一

go中空接口的具体使用

《go中空接口的具体使用》空接口是一种特殊的接口类型,它不包含任何方法,本文主要介绍了go中空接口的具体使用,具有一定的参考价值,感兴趣的可以了解一下... 目录接口-空接口1. 什么是空接口?2. 如何使用空接口?第一,第二,第三,3. 空接口几个要注意的坑坑1:坑2:坑3:接口-空接口1. 什么是空接

Spring Boot 3.4.3 基于 Spring WebFlux 实现 SSE 功能(代码示例)

《SpringBoot3.4.3基于SpringWebFlux实现SSE功能(代码示例)》SpringBoot3.4.3结合SpringWebFlux实现SSE功能,为实时数据推送提供... 目录1. SSE 简介1.1 什么是 SSE?1.2 SSE 的优点1.3 适用场景2. Spring WebFlu