汇编个位数求和实验


title: 汇编求和实验
keywords: 汇编
tags: [汇编]
categories: 嵌入式


汇编求和实验

刚开始学习汇编 给大家做个参考

实验 5 子程序 5.1 实验目的 ①掌握利用堆栈传递参数的子程序调用方法。 ②过程调用伪指令:PROC,ENDP,NEAR和FAR。 ③8088指令:CALL,RET,RETn。 5.2 实验类型 验证型实验\2. 操作步骤 ①输入,编译并运行程序。 ②用emu8086运行此程序,观察并记录每次过程调用及进出栈指令前后的SP和堆栈内容。 ③记录最后结果:SUM1,SUM2的段及偏移地址和它们的内容。 ④修改并自编程序,使得在屏幕上可以输入任意6个十进制数字,同时在屏幕上输出SUM1 的结果(要求输出十进制数字,打印出有效2位数即可)。

  1. AX:这是一个通用寄存器,通常用于算术和逻辑操作。在这段程序中,它被用来存储 DATAS 段的地址,然后这个地址被移动到 DS 寄存器。

  2. DS:这是一个段寄存器,用于存储数据段的地址。在这段程序中,它被设置为 DATAS 段的地址,这样程序就可以访问在 DATAS 段中定义的数据了。

  3. SI:这是一个索引寄存器,通常用于存储数组或字符串的索引。在这段程序中,它被用来存储 DATA 数组的当前索引。

  4. CX:这是一个计数寄存器,通常用于存储循环的次数。在这段程序中,它被设置为6,表示输入循环的次数。

  5. DX:这是一个通用寄存器,通常用于I/O操作。在这段程序中,它被用来存储字符串的地址,然后这个地址被用于 INT 21H 中断,以打印字符串。

  6. AH:这是 AX 寄存器的高8位,通常用于存储操作码。在这段程序中,它被设置为9,表示打印字符串的操作。

  7. DI:这是一个索引寄存器,通常用于存储数组或字符串的索引。在这段程序中,它被初始化为0,用于打印总和。

    修改并自编程序,使得在屏幕上可以输入任意6个十进制数字,同时在屏幕上输出SUM1 的结果(要求输出十进制数字,打印出有效2位数即可)。

DATAS SEGMENT
    string_1 DB 'input','$' ; 提示输入
    string_2 DB 'input again','$' ; 无效输入的错误消息
    string_3 DB ' ','$' ; 空格字符
    DATA  DW 10 DUP(?) ; 存储输入数字的数组
    message  DB 0ah,'sum:',0DH,'$' ; 总和输出的消息
DATAS ENDS

STACKS SEGMENT
    DW 256 dup(?) 
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS

START:
    MOV AX,DATAS
    MOV DS,AX ; 设置DS寄存器指向DATAS段
    MOV SI, 0  ; 指针初始化
    MOV CX, 6 ; 循环次数

    MOV DX, OFFSET string_1 ; 提示输入
    MOV AH, 9
    INT 21H

Lp:
    CALL Input ; 调用输入子程序
    ADD SI, 2 ; 指针增加2(每个输入数字占2个字节)
    Loop Lp ; 循环直到所有数字输入完毕

  
    MOV DX, OFFSET message ; 打印总和消息
    MOV AH, 9
    INT 21H

    CALL Get_sum ; 调用Get_sum子程序计算总和

    MOV DX, AX
    ADD DX, 30H
    MOV AH, 2
    INT 21H
    
    MOV AH, 4CH 
    INT 21H

Input PROC Near
    push AX 
    push BX
    push CX 
    push DX 

    MOV BX, 0 
    CLC ; 清除进位标志
    MOV DX, 0 

    Lp_0:
        MOV AH, 1
        INT 21H ; 从输入中读取一个字符

        CMP AL, 20H ; 检查输入是否为空格字符
        JE L_CRLF ; 如果是空格,跳转到L_CRLF
        
        SUB AL, 30H ; 将ASCII转换为整数
        MOV AH, 0 ; 清除AH寄存器
        XCHG AX, BX ; 交换AX和BX寄存器
        JMP Lp_0 ; 继续输入循环


    L_CRLF: ; 输入结束标记(换行)
        MOV DX, 0
        MOV DATA[SI], BX ; 将输入数字存储在DATA数组中
        POP DX
        POP CX
        POP BX
        POP AX
        RET
Input ENDP

Get_sum PROC NEAR
    PUSH BX
    PUSH CX

    MOV BX, 0
    MOV CX , 6
    MOV DI, 0

LOP1:
    MOV AX, DATA[DI]
    ADD BX, AX
    ADD DI , 2
    LOOP LOP1


    MOV AX, BX
    POP BX
    POP CX
    RET
Get_sum ENDP

CODES ENDS
END START

Input过程是一个子程序,用于读取用户的输入。它首先将AX、BX、CX和DX寄存器的值压入堆栈以保存它们的当前状态。然后,它使用DOS中断21H的功能1来读取用户的输入。如果输入是空格(ASCII值为20H),则结束输入;否则,将输入的ASCII值转换为数字,并存储在BX寄存器中。最后,将BX寄存器的值存储在DATA数组中,并恢复AX、BX、CX和DX寄存器的值。

Get_sum过程是另一个子程序,用于计算DATA数组中的所有数字的和。它首先将BX和CX寄存器的值压入堆栈以保存它们的当前状态。然后,它初始化BX寄存器为0,用于存储和;初始化CX寄存器为6,表示要加的数字的数量;初始化DI寄存器为0,表示数组的索引。然后,它在循环中将DATA数组中的每个数字加到BX寄存器中。最后,将和存储在AX寄存器中,并恢复BX和CX寄存器的值。

但这个有致命缺点

笑死了 直接加0x30得到十进制数字就是 只有0-9可以正常输出结果

首先,它将12赋值给AX寄存器,然后将10赋值给CL寄存器。然后,它使用div cl指令将AX寄存器的值除以CL寄存器的值。在这个操作后,商(也就是十位数)存储在AL寄存器中,余数(也就是个位数)存储在AH寄存器中。然后,它将AH寄存器的值复制到BH寄存器中。

然后,它检查AL寄存器的值是否为0。如果AL寄存器的值为0,那么它将跳转到tito标签,否则,它将继续执行。

接下来,它将AL寄存器的值复制到DL寄存器中,然后将DL寄存器的值增加30H(因为在ASCII编码中,数字字符的编码是从30H开始的)。然后,它将AH寄存器的值设置为2,然后调用DOS中断21H的功能2,将DL寄存器中的字符输出。

tito标签处,它将BH寄存器的值复制到DH寄存器中,然后将DH寄存器的值增加30H。然后,它将AH寄存器的值设置为2,然后调用DOS中断21H的功能2,将DH寄存器中的字符输出。

DATAS SEGMENT
    string_1 DB 'input','$' ; 提示输入
    string_2 DB 'input again','$' ; 无效输入的错误消息
    string_3 DB ' ','$' ; 空格字符
    DATA  DW 6 DUP(?) ; 存储输入数字的数组
    message  DB 'sum:',0ah,'$' ; 总和输出的消息
DATAS ENDS

STACKS SEGMENT
    DW 256 dup(?) 
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS

START:
    MOV AX,DATAS
    MOV DS,AX ; 设置DS寄存器指向DATAS段
    MOV SI, 0  ; 指针初始化
    MOV CX, 6 ; 循环次数

    MOV DX, OFFSET string_1 ; 提示输入
    MOV AH, 9
    INT 21H

Lp:
    CALL Input ; 调用输入子程序
    ADD SI, 2 ; 指针增加2(每个输入数字占2个字节)
    Loop Lp ; 循环直到所有数字输入完毕

  
    MOV DX, OFFSET message ; 打印总和消息
    MOV AH, 9
    INT 21H

    CALL Get_sum ; 调用Get_sum子程序计算总和存到ax
                   
    mov cl, 10
    div cl     
    mov bh,ah 

    cmp al, 0
    je tito          ;十位为零 跳转tito

    MOV Dl, al  
    ADD dl, 30H
    MOV AH, 2
    INT 21H        

tito:
    MOV Dl, bh  
    ADD dl, 30H
    MOV AH, 2
    INT 21H 


    

Input PROC Near
    push AX 
    push BX
    push CX 
    push DX 

    MOV BX, 0 
    CLC ; 清除进位标志
    MOV DX, 0 

    Lp_0:
        MOV AH, 1
        INT 21H ; 从输入中读取一个字符

        CMP AL, 20H ; 检查输入是否为空格字符
        JE L_CRLF ; 如果是空格,跳转到L_CRLF
        
        SUB AL, 30H ; 将ASCII转换为整数
        MOV AH, 0 ; 清除AH寄存器
        XCHG AX, BX ; 交换AX和BX寄存器
        JMP Lp_0 ; 继续输入循环


    L_CRLF: ; 输入结束标记(换行)
        MOV DX, 0
        MOV DATA[SI], BX ; 将输入数字存储在DATA数组中
        POP DX
        POP CX
        POP BX
        POP AX
        RET
Input ENDP

Get_sum PROC NEAR
    PUSH BX
    PUSH CX

    MOV BX, 0
    MOV CX , 6
    MOV DI, 0

LOP1:
    MOV AX, DATA[DI]
    ADD BX, AX
    ADD DI , 2
    LOOP LOP1


    MOV AX, BX
    POP BX
    POP CX
    RET
Get_sum ENDP

CODES ENDS
END START

如此我们便完成这节课的任务了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/603444.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

环形链表问题详解

引言 环形链表的题大家都应该做过,如果没有做过可以去某扣上做一下 ,下面有传送门 141. 环形链表 - 力扣(LeetCode)https://leetcode.cn/problems/linked-list-cycle/submissions/530160081/ 正文 如果在面试的情况下出现了环形链表的题大…

QLineEdit 最右侧添加按钮

如果采用QLineEdit + QPushButton的方式的话,无法将按钮放到QLineEdit的输入框内部,所以下面的方法可以将按钮放到QLineEdit内部的最右侧,效果: 代码如下: QLineEdit* editor = new QLineEdit(parent); QToolButton* btn = new QToolButton; btn->setText("...&q…

【噪声学习】噪声标签的鲁棒点云分割

Robust Point Cloud Segmentation with Noisy Annotations 事实上,与二维图像标注[1]、[2]相比,三维数据的干净标签更难获得。这主要是因为1)需要标注的点数通常非常庞大,例如在 ScanNetV2 [3] 中标注一个典型的室内场景时,需要标注百万量级的点数;2)标注过程本身更加复…

使用SmartEDA电路仿真软件,让这五件事变得很简单

SmartEDA电路仿真软件:轻松实现电子设计五大突破 在电子设计领域,SmartEDA电路仿真软件以其强大的功能和用户友好的界面,成为了设计师们的得力助手。这款软件不仅简化了电路设计流程,还提高了设计效率,让以下五件事情…

【驱动】I2C读写时序

1、I2C总线 I2C使用两条线在主控制器和从机之间通信,SCL(串行时钟线)和SDA(串行数据线),这两条线需接5~10欧上拉电阻,总线空闲空闲时,SCL和SDA处于高电平,I2C总线标准模式速度可以达到100K/S,快速模式可以达到400K/S。 2、状态 I2C总线有四种状态:空闲、启动、忙碌、…

品质为王:高效溶解性鱼油胶囊的软胶囊弹性硬度测试解析

品质为王:高效溶解性鱼油胶囊的软胶囊弹性硬度测试解析 在当今的健康产品市场中,高效溶解性鱼油胶囊以其独特的营养价值和吸收效率赢得了众多消费者的青睐。然而,要想在激烈的市场竞争中脱颖而出,产品的品质保证至关重要。其中&a…

RabbitMQ-基础

RabbitMQ 同步调用 双方交互都是实时的,可以立即返回结果 问题 拓展性差:每次有新的需求,代码经常变动,不符合开闭原则性能下降:调用者需要等待服务提供者分别执行后才返回结果,服务提供者很多情况下会…

看完这个,你就懂了!IT审计到底是干什么的?如何做好IT审计?

01 大家应该都知道财务审计, 通俗讲,就是查账的。 看一下公司账上的数据是否准确, 每笔账是否都能合理溯源。 那IT审计到底是干什么的呢? 它和财务审计有什么关系吗? 这么跟你说吧, 现在很多公司都…

Etcd集群选举细节

日志级别 在 etcd 集群中,领导者选举是 Raft 协议的一部分,用于在当前领导者失败或无法与集群中的其他节点通信时选出新的领导者。以下是您提供的日志中与领导者选举相关的一些关键条目,以及对它们的详细说明: 节点失去领导者&am…

Delta lake with Java--使用stream同步数据

今天继续学习Delta lake Up and Running 的第8章,处理流数据,要实现的效果就是在一个delta表(名为:YellowTaxiStreamSource)插入一条数据,然后通过流的方式能同步到另外一个delta表 (名为&#…

机器人系统可以支持对接人工系统吗?

​ 随着科技的飞速发展,机器人系统在各行各业都扮演着越来越重要的角色。它们可以高效地处理大量数据,执行繁琐的任务,甚至在某些领域超越了人类的能力。然而,机器人系统也有其局限性,特别是在处理复杂的人际交往…

自动驾驶主流芯片及平台架构(四)华为、​高通、英伟达高算力平台

上一章节有提到低算力的自动驾驶平台,本章内容重点介绍高算力的自动驾驶平台,华为、高通、英伟达。 华为自动驾驶MDC平台方案介绍 以整车数字架构为基础,全面管理软硬件的复杂性,并确保整车的可靠性:我们提出华为CCAVe…

批量图片重命名及汇总

又一堆图片文件需要处理... 源文件分布: 有N个文件夹,每个文件夹下又有M个子文件夹,每个子文件夹下有X张图片。 例如文件夹A下有子文件夹A1,A2,A3,子文件夹A1下有图片a-1,a-2,a-3...... 处理目标: 1、将所有图片汇…

算法提高之树的中心

算法提高之树的中心 核心思想:树形dp 换根dp 每个点作为根节点 找其子树的最大距离和父节点的最大距离 dfs1:求子树对于当前根节点的最大距离和次大距离 求次大距离原因:如果当前节点是其父节点子树的最大路径上的点,最大距离不…

基于Linux中的 进程相关知识 综合讲解

目录 一、进程的基本概念 二、pid,ppid,fork函数 三、进程的状态讲解 四、进程的优先级 五、完结撒❀ 一、进程的基本概念 概念: ● 课本概念:程序的一个执行实例,正在执行的程序等 ● 内核观点:担当…

深度学习实例2_车牌识别分割——自学笔记

import cv2 from matplotlib import pyplot as plt import os import numpy as np from PIL import ImageFont, ImageDraw, Image彩色图片显示 def plt_show0(img):b,g,r = cv2.split(img)img = cv2.merge([r, g, b])plt.imshow(img)plt.show()灰度图片显示 def plt_show(img…

暗区突围PC测试资格获取 Twitch老鼠台一键领取测试资格教程

Twitch平台,这个广受欢迎的直播巨头,不仅是游戏文化的直播聚集地,还常与各类游戏携手合作,为观众带来独特的互动体验,观看直播即可解锁游戏内奖励。正值热门游戏《暗区突围》PC版测试阶段,Twitch再次发力&a…

Ai时代使用语音笔记整理文稿提高创作效率

其实传统的创作方式是用钢笔或者圆珠笔手写草稿。成稿后花钱誊抄数份邮寄给出版商。 计算机普及后,有人开始直接使用打字机或计算机创做,打字其实要比手写的速度快数倍,这样效率的提升,加上文创平台基本上都是按字数给收益&#…

去哪找高清视频素材?哪个网站有视频素材?

在这个视觉表达日益重要的时代,获取高品质的视频素材变得尤为关键。4K和无水印视频素材特别受到创作者的青睐,因为它们能极大地提升视觉作品的吸引力和专业度。接下来,我将介绍几个国内外的优秀视频素材网站,助您在创作旅程上一帆…

为什么现在越来越多的人会选择陪诊

现在越来越多的人选择陪诊的原因有多方面。 首先,随着人口老龄化、医疗资源分配不均等问题的日益突出,许多老年人和病患在就医过程中面临诸多困难,如挂号、排队、取药等繁琐的手续和流程。陪诊服务能够为他们提供极大的便利,帮助…
最新文章