8086汇编综合运用例题(个人学习总结)

在这里插入图片描述
(初学者、代码比较乱、复用性较差,寄存器使用也比较乱)
涉及知识点:ascii转数字、数组存储学生成绩、冒泡排序、保留小数四舍五入
代码时遇到的小错误:进行乘除法时寄存器未清零出bug,比如dx寄存器
代码:

DATAS SEGMENT
   buf db 30,?,30 dup('$');输入缓冲
   array db 30 dup('#');存成绩的数组
   HINT1 db 'Please enter 6 grades: $'
   HINT2 db 'The number of pass: $'
   HINT3 db 'The number of failures: $'
   HINT4 db 'Ranking of grades: $'
   HINT5 db 'Average score: $'
   temp_g db 0
   temp_s db 0
   temp_b db 0
   temp_sum db 0
   temp db 0
   sum dw 0;储存总成绩
   jige db '0';及格人数
   bujige db '0';不及格人数
   gw db 0;个位
   sw db 0;十位
   bw db 0;百位
   ;以下是字类型的个位十位百位
   gg dw 0;
   sss dw 0;ss不能用,所以用了sss
   bb dw 0
   xs dw 0;小数
DATAS ENDS

STACKS SEGMENT PARA STACK
    DB 20H DUP(0);此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    ;此处输入代码段代码
    lea dx,HINt1
    mov ah,9
    int 21h  
    lea dx,buf
    mov ah,10
    int 21h
    call huanhang
;思路:通过3个temp存个位十位百位,统计2个空格间的字符数,若为三个则算三位,若为两个则2位
;寄存器使用:bl作为计数器 di存数组地址
;在遇到空格前,si+1遍历,遇到空格后,先将此时的si存入某寄存器,接着根据计数器为2/3逆向遍历存入个位十位或者百位
;接着处理下一个数据 
initial:
	mov cl,buf+1
    xor ch,ch
    lea si,buf+2
    lea di,array
    xor bx,bx
	mov bl,0
	xor dx,dx
	xor ax,ax
lop:;计算数字位数
	mov al,[si]
	cmp al,' '
	jne looop
store:
b:
	cmp bl,3
	jne s
	dec bl
	mov al,[si-3]
	mov temp_b,al
	sub al,30h
	mov temp,100
	mul temp
	mov temp_sum,al
	
	xor ax,ax
	jmp s		
s:
	cmp bl,2
	jne g
	dec bl
	mov al,[si-2]
	mov temp_s,al
	sub al,30h
	mov temp,10
	mul temp
	add temp_sum,al
	jmp g
g:	
	cmp bl,1
	jne s
	dec bl
	mov al,[si-1]
	mov temp_g,al
	sub al,30h
	add temp_sum,al
	mov al,temp_sum
	mov [di],al
	inc di
	
	;同时把个位、十位、百位-30h后乘以各自权值加到一起,存入数组中,以便排序
	
	jmp con
con:
	mov temp_sum,0
	mov temp_g,0
	mov temp_s,0
	mov temp_b,0
	xor bx,bx
	mov bl,0
	jmp conloop
looop:
	inc bl;正常情况需要bl+1,但是当读取下一个数据是bl清零了,不能在这加一,所以有了conlop
conloop:	
	inc si	
	loop lop
	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	;以上是存储待排序数组的内容
	;接下来进行排序
	;mov di,si
	lea si,array
	mov ch,7
	mov cl,5
	mov bx,0
xh1:
	mov bx,0 
	mov cl,5
	dec ch
	cmp ch,0
	jle endxh1
 xh2:
 	cmp cl,0
 	jle xh1
	mov al,[si][bx]
	cmp al,[si+1][bx]
	ja change
	jmp nextxh
  change:
 	mov dl,[si+1][bx]
 	mov [si][bx],dl
 	mov [si+1][bx],al
  nextxh:
  	dec cl
  	inc bx
  	jmp xh2	
endxh1:
		
	;以上是排序内容,接下来进行排序后的数组的输出,同时统计了及格人数和不及格人数
	lea si,array
	mov cx,6
	lea dx,HINt4
    mov ah,9
    int 21h  
output:
	dec cx
	mov al,[si]
	;;;
	xor bx,bx
	xor ah,ah
	add sum,ax;;;;;;;;;;;;;;;;;;;;;在此将成绩加入sum
	mov bl,10
	div bl
	add ah,30h
	mov gw,ah
	mov ah,0
	div bl
	add ah,30h
	mov sw,ah
	add al,30h
	mov bw,al
	mov dl,bw;输出
	mov ah,2
	int 21h
	mov dl,sw;输出
	mov ah,2
	int 21h
	mov dl,gw;输出
	mov ah,2
	int 21h
	mov dl,' ';输出
	mov ah,2
	int 21h
	;;;
	mov al,[si]
	cmp al,60
	jae addjige
	inc bujige
	jmp jmpjige
addjige: 
	inc jige
jmpjige:
	inc si
	cmp cx,0
	ja output
	;下面输出及格和不及格人数
	call huanhang
	lea dx,HINt2
    mov ah,9
    int 21h  
    mov dl,jige;输出
	mov ah,2
	int 21h
	mov dl,' ';输出
	mov ah,2
	int 21h
	lea dx,HINt3
    mov ah,9
    int 21h  
    mov dl,bujige;输出
	mov ah,2
	int 21h
	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	;以上计算得到了总成绩,接下来进行平均成绩的计算和输出
	call huanhang
	lea dx,HINT5
	mov ah,9
	int 21h
	mov cx,6
compute_sum:
	xor dx,dx 
	mov bx,6
	mov ax,sum
	mov cx,sum;;;;;暂存sum算小数的时候取出
	div bx
	mov sum,ax
	mov bx,10
	xor dx,dx
	div bx
	add dx,30h
	mov gg,dx
	xor dx,dx
	div bx
	add dx,30h
	mov sss,dx
	add ax,30h
	mov bb,ax
	xor dx,dx
	;下面进行小数部分计算,保留一位小数,第二位小数四舍五入
	mov sum,cx;取出sum
	mov ax,sum
	mov bx,10
	mul bx
	mov bx,6
	div bx
	xor dx,dx
	mov bx,10
	div bx
	add dx,30h
	mov xs,dx
	
	mov ax,sum
	mov bx,100
	mul bx
	mov bx,6
	div bx
	xor dx,dx
	mov bx,10
	div bx
	cmp dx,5
	jge jinwei
	jmp bujinwei
jinwei:
	inc xs	
bujinwei:	
	mov dl,byte ptr bb;输出
	mov ah,2
	int 21h
	mov dl,byte ptr sss;输出
	mov ah,2
	int 21h
	mov dl,byte ptr gg;输出
	mov ah,2
	int 21h
	mov dl,'.';输出
	mov ah,2
	int 21h
	mov dl,byte ptr xs;输出
	mov ah,2
	int 21h
	
	;程序结束
	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	jmp break
huanhang PROC
    mov dl,13;回车
	mov ah,2
	int 21h
	mov dl,10;换行
	mov ah,2
	int 21h
    RET
huanhang ENDP   
	
break:
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START


如果有帮助记得点个赞~

热门文章

暂无图片
编程学习 ·

exe4j详细使用教程(附下载安装链接)

一、exe4j介绍 ​ exe4j是一个帮助你集成Java应用程序到Windows操作环境的java可执行文件生成工具,无论这些应用是用于服务器,还是图形用户界面(GUI)或命令行的应用程序。如果你想在任务管理器中及Windows XP分组的用户友好任务栏…
暂无图片
编程学习 ·

AUTOSAR从入门到精通100讲(126)-浅谈车载充电系统通信方案

01 引言 本文深入研究车载充电系统策略,设计出一套基于电动汽车电池管理系统与车载充电机的CAN通信协议,可供电动汽车设计人员参考借鉴。 02 电动汽车充电系统通讯网络 电动汽车整车控制系统中采用的是CAN总线通信方式,由一个整车内部高速CAN网络、内部低速CAN网络和一个充电…
暂无图片
编程学习 ·

CMake(九):生成器表达式

当运行CMake时,开发人员倾向于认为它是一个简单的步骤,需要读取项目的CMakeLists.txt文件,并生成相关的特定于生成器的项目文件集(例如Visual Studio解决方案和项目文件,Xcode项目,Unix Makefiles或Ninja输入文件)。然…
暂无图片
编程学习 ·

47.第十章 网络协议和管理配置 -- 网络配置(八)

4.3.3 route 命令 路由表管理命令 路由表主要构成: Destination: 目标网络ID,表示可以到达的目标网络ID,0.0.0.0/0 表示所有未知网络,又称为默认路由,优先级最低Genmask:目标网络对应的netmaskIface: 到达对应网络,应该从当前主机哪个网卡发送出来Gateway: 到达非直连的网络,…
暂无图片
编程学习 ·

元宇宙技术基础

请看图: 1、通过AR、VR等交互技术提升游戏的沉浸感 回顾游戏的发展历程,沉浸感的提升一直是技术突破的主要方向。从《愤怒的小鸟》到CSGO,游戏建模方式从2D到3D的提升使游戏中的物体呈现立体感。玩家在游戏中可以只有切换视角,进而提升沉浸…
暂无图片
编程学习 ·

flink的伪分布式搭建

一 flink的伪分布式搭建 1.1 执行架构图 1.Flink程序需要提交给 Job Client2.Job Client将作业提交给 Job Manager3.Job Manager负责协调资源分配和作业执行。 资源分配完成后,任务将提交给相应的 Task Manage。4.Task Manager启动一个线程以开始执行。Task Manage…
暂无图片
编程学习 ·

十进制正整数与二进制字符串的转换(C++)

Function one: //十进制数字转成二进制字符串 string Binary(int x) {string s "";while(x){if(x % 2 0) s 0 s;else s 1 s;x / 2;}return s; } Function two: //二进制字符串变为十进制数字 int Decimal(string s) {int num 0, …
暂无图片
编程学习 ·

[含lw+源码等]微信小程序校园辩论管理平台+后台管理系统[包运行成功]Java毕业设计计算机毕设

项目功能简介: 《微信小程序校园辩论管理平台后台管理系统》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 本系统包含微信小程序做的辩论管理前台和Java做的后台管理系统: 微信小程序——辩论管理前台涉及技术:WXML 和 WXS…
暂无图片
编程学习 ·

树莓派驱动DHT11温湿度传感器

1,直接使用python库 代码如下 import RPi.GPIO as GPIO import dht11 import time import datetimeGPIO.setwarnings(True) GPIO.setmode(GPIO.BCM)instance dht11.DHT11(pin14)try:while True:result instance.read()if result.is_valid():print(ok)print(&quo…
暂无图片
编程学习 ·

ELK简介

ELK简介 ELK是三个开源软件的缩写,Elasticsearch、Logstash、Kibana。它们都是开源软件。不过现在还新增了一个 Beats,它是一个轻量级的日志收集处理工具(Agent),Beats 占用资源少,适合于在各个服务器上搜集日志后传输给 Logstas…
暂无图片
编程学习 ·

Linux 基础

通常大数据框架都部署在 Linux 服务器上,所以需要具备一定的 Linux 知识。Linux 书籍当中比较著名的是 《鸟哥私房菜》系列,这个系列很全面也很经典。但如果你希望能够快速地入门,这里推荐《Linux 就该这么学》,其网站上有免费的电…
暂无图片
编程学习 ·

Windows2022 无线网卡装不上驱动

想来 Windows2022 和 windows10/11 的驱动应该差不多通用的,但是死活装不上呢? 搜一下,有人提到 “默认安装时‘无线LAN服务’是关闭的,如果需要开启,只需要在“添加角色和功能”中,选择开启“无线LAN服务…
暂无图片
编程学习 ·

【嵌入式面试宝典】版本控制工具Git常用命令总结

目录 创建仓库 查看信息 版本回退 版本检出 远程库 Git 创建仓库 git initgit add <file> 可反复多次使用&#xff0c;添加多个文件git commit -m <message> 查看信息 git status 仓库当前的状态git diff 差异对比git log 历史记录&#xff0c;提交日志--pret…
暂无图片
编程学习 ·

用Postman生成测试报告

newman newman是一款基于nodejs开发的可以运行postman脚本的工具&#xff0c;使用Newman&#xff0c;可以直接从命令运行和测试postman集合。 安装nodejs 下载地址&#xff1a;https://nodejs.org/en/download/ 选择自己系统相对应的版本内容进行下载&#xff0c;然后傻瓜式安…
暂无图片
编程学习 ·

Java面向对象之多态、向上转型和向下转型

文章目录前言一、多态二、引用类型之间的转换Ⅰ.向上转型Ⅱ.向下转型总结前言 今天继续Java面向对象的学习&#xff0c;学习面向对象的第三大特征&#xff1a;多态&#xff0c;了解多态的意义&#xff0c;以及两种引用类型之间的转换&#xff1a;向上转型、向下转型。  希望能…