西电计科微机原理实验二(详细注释版)

西电计科微机原理实验二(详细注释版)

环境:VSCode+MASM/TASM插件(建议使用相同环境,学校机房环境有点老,可能会出一些奇怪的问题)

avatar

实验室:EⅡ-522

实验要求
  1. 输入一个不超过5位的十进制数,回车结束输入,并将其转换为二进制数,输出到屏幕上
  2. 输入非数字字符,报错,重新输入
  3. 输入q或Q,结束程序
  4. 输入字符串,空格结束输入,统计字符串中数字的个数 (选做)
基础版本(不做4)
_STACK SEGMENT PARA STACK'_STACK'
DB 128 DUP(0)
_STACK ENDS


DATA SEGMENT
    hello DB 'Input a number or an instruction!!Q OR q: EXIT',0AH,0DH,'$'
    wrong DB 0AH,0DH,'Wrong Input(only numbers!)',0AH,0DH,'$'
    endofhex DB 0AH,0DH,'Binary:',0AH,0DH,'$'
    finish DB 0AH,0DH,'Finished',0AH,0DH,'$'
    got DB 5 DUP(0)
DATA ENDS


CODE SEGMENT
assume cs:CODE,ds:DATA,ss:_STACK

START:

beginofread:
    mov ax,DATA
    mov ds,ax
    ;取偏移地址
    mov dx,offset hello
    ;显示字符串
    mov ah,09H
    int 21H
    ; 清零BX
    mov bx,0H
    ; 初始化DI和CX
    mov di,offset got
    mov cx,0H
readchar:
    ; 读取字符
    mov ah,01H
    int 21H
    ; 比较BX是否为0,如果不是,跳到notfirst
    cmp bx,0H
    jne notfirst
    ; 比较AL是否为Q或q,如果是,则退出程序
    cmp al,'Q'
    je exit
    cmp al,'q'
    je exit


notfirst:
;判断是否合法
    mov bx,01H
    call legalcheck
;不合法重新开始
    cmp bx,02H
    je beginofread
;换行输入结束
    cmp bx,04H
    je endofinput

    jmp loadinmemory

loadinmemory:
;输入存入内存
    mov [di],al
    inc cx
    inc di
    jmp readchar

endofinput:
;取前5位
    mov dx,0H
    mov di,offset got

;将数字转换为ascii码
beginofhandle:
    mov bx,0H
    mov bl,[di]
    ; 将寄存器BX中的值减去30H
    sub bx,30H  
    add dx,bx
    ;处理完毕
    cmp cx,1H
    je endofhandle
    ;ax清零,乘10
    call mulAHdxtodx
    ;待处理字符减一
    dec cx
    ;下一位
    inc di
    jmp beginofhandle

;输出ASCII码
endofhandle:
;输出2进制
    call binaryoutput
;跳转重新开始
    jmp beginofread

binaryoutput:
    mov bx,dx
    mov dx,0H
    mov cx,10H ;循环16次
    ;开始循环
beginofoutputloop:
;左移1位
    shl bx,1
;不进位则跳转
    jnc out0
    mov dl,'1'
    jmp outputdl
out0:
    mov dl,'0'
outputdl:
    mov ah,02H
    int 21H
    dec cx ;循环次数减1
    cmp cx,0H ;判断循环是否结束
    jne beginofoutputloop
    ;结束循环,输出结束语句
    mov dx,offset finish 
    mov ah,09H 
    int 21H
    ret

legalcheck:
;判断换行
    cmp al,0DH
    je endlegalnextline
;判断数字0-9
    cmp al,30H
    jb endlegalfalse
    cmp al,39H
    ja endlegalfalse

endlegaltrue:
    mov bx,03H
    ret

endlegalnextline:
    mov bx,04H
    ret

endlegalfalse:
;输出wrong语句
    mov dx,offset wrong
    mov ah,09H
    int 21H
;重新开始程序
    mov bx,02H
    ret


mulAHdxtodx:
    mov bx,0H
    mov ax,0H
    
loopofmul:
    add ax,dx
    inc bx
    cmp bx,0AH
    jb loopofmul
    mov dx,ax
    ret

exit:
    mov ah,4CH
    int 21H
CODE ENDS
END START

运行结果:

avatar

完整版
_STACK SEGMENT PARA STACK'_STACK'
DB 128 DUP(0)
_STACK ENDS


DATA SEGMENT
    hello DB 'Input a number or an instruction!!Q OR q: EXIT,s:SEARCH',0AH,0DH,'$'
    wrong DB 0AH,0DH,'Wrong Input(only numbers!)',0AH,0DH,'$'
    endofhex DB 0AH,0DH,'Binary:',0AH,0DH,'$'
    finish DB 0AH,0DH,'Finished',0AH,0DH,'$'
    hello2 DB 0AH,0DH,'Search number inyour string. Space to end input',0AH,0DH,'Input string:',0AH,0DH,'$'
    finish2 DB 0AH,0DH,'FINISHED!!!',0AH,0DH,'THERE ARE ','$'
    finish3 DB ' numbers',0AH,0DH,'$'
    got DB 5 DUP(0)
DATA ENDS


CODE SEGMENT
assume cs:CODE,ds:DATA,ss:_STACK

START:

beginofread:
    mov ax,DATA
    mov ds,ax
    ;取偏移地址
    mov dx,offset hello
    ;显示字符串
    mov ah,09H
    int 21H
    ; 清零BX
    mov bx,0H
    ; 初始化DI和CX
    mov di,offset got
    mov cx,0H
readchar:
    ; 读取字符
    mov ah,01H
    int 21H
    ; 比较BX是否为0,如果不是,跳到notfirst
    cmp bx,0H
    jne notfirst
    ; 比较AL是否为Q或q,如果是,则退出程序
    cmp al,'Q'
    je exit
    cmp al,'q'
    je exit
    ; 比较AL是否为s,如果是,则进行搜索操作
    cmp al,'s'
    je counterofnumber


notfirst:
;判断是否合法
    mov bx,01H
    call legalcheck
;不合法重新开始
    cmp bx,02H
    je beginofread
;换行输入结束
    cmp bx,04H
    je endofinput

    jmp loadinmemory

loadinmemory:
;输入存入内存
    mov [di],al
    inc cx
    inc di
    jmp readchar

endofinput:
;取前5位
    mov dx,0H
    mov di,offset got

;将数字转换为ascii码
beginofhandle:
    mov bx,0H
    mov bl,[di]
    ; 将寄存器BX中的值减去30H
    sub bx,30H  
    add dx,bx
    ;处理完毕
    cmp cx,1H
    je endofhandle
    ;ax清零,乘10
    call mulAHdxtodx
    ;待处理字符减一
    dec cx
    ;下一位
    inc di
    jmp beginofhandle

;输出ASCII码
endofhandle:
;输出2进制
    call binaryoutput
;跳转重新开始
    jmp beginofread

binaryoutput:
    mov bx,dx
    mov dx,0H
    mov cx,10H ;循环16次
    ;开始循环
beginofoutputloop:
;左移1位
    shl bx,1
;不进位则跳转
    jnc out0
    mov dl,'1'
    jmp outputdl
out0:
    mov dl,'0'
outputdl:
    mov ah,02H
    int 21H
    dec cx ;循环次数减1
    cmp cx,0H ;判断循环是否结束
    jne beginofoutputloop
    ;结束循环,输出结束语句
    mov dx,offset finish 
    mov ah,09H 
    int 21H
    ret

legalcheck:
;判断换行
    cmp al,0DH
    je endlegalnextline
;判断数字0-9
    cmp al,30H
    jb endlegalfalse
    cmp al,39H
    ja endlegalfalse

endlegaltrue:
    mov bx,03H
    ret

endlegalnextline:
    mov bx,04H
    ret

endlegalfalse:
;输出wrong语句
    mov dx,offset wrong
    mov ah,09H
    int 21H
;重新开始程序
    mov bx,02H
    ret

mulAHdxtodx:
    mov bx,0H
    mov ax,0H
    
loopofmul:
    add ax,dx
    inc bx
    cmp bx,0AH
    jb loopofmul
    mov dx,ax
    ret

counterofnumber:
    mov dx,offset hello2
    mov ah,09H
    int 21H
    mov cx,0H
beginofcount:
    mov ah,01H
    int 21H
    ;空格完成输入
    cmp al,20H
    je endofcount
    cmp al,30H
    jb notnum
    cmp al,39H
    ja notnum
isnum:
    inc cx
    jmp beginofcount
notnum:
    jmp beginofcount
endofcount:
    add cx,30H
    mov dx,offset finish2
    mov ah,09H
    int 21H
    mov dx,0H
    mov dl,cl
    mov ah,02H
    int 21H
    mov dx,offset finish3
    mov ah,09H
    int 21H
    ;跳回开始位置
    jmp beginofread




exit:
    mov ah,4CH
    int 21H
CODE ENDS
END START


运行结果:
avatar

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

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

相关文章

git客户端安装问题

问题回顾: 做git客户端版本升级,安装好之后提示git:‘remote-https‘ 不是一个 git 命令。参见 git --help。 问题处理: 缺少第二步依赖下载 安装步骤: 1、删除安装git yum remove git 2、安装依赖 yum install lib…

Java常用注解

文章目录 第一章、Java注解与元数据1.1)元数据与注解概念介绍1.2)Java注解的作用和使用1.3)注解的分类 第二章、Mybatis框架常用注解2.1)Mybatis注解概览2.2)常用注解MapperScanMapperSelectInsertUpdateDeleteParam结…

tcp的聊天室

注意&#xff1a;要加库文件&#xff0c;服务端客户端都要加 network 客户端的头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpSocket>//客户端类 #include <QMessageBox>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } Q…

Ubuntu 设置共享文件夹

一、在Windows中建立一个英文的文件夹 注意&#xff1a;新建文件夹的名称一定要是英文的&#xff0c;不能出现中文的路径&#xff08;可能出现问题&#xff09; 二、在VMware中添加共享文件 3: VMware安装VMware Tools 一般安装成功桌面上会显示这个安装包&#xff0c;&…

RV32/64 特权架构

machine mode: 运行最可信的代码;supervisor mode:为 Linux&#xff0c;FreeBSD 和 Windows 等操作系统提供支持;user mode:权限最低&#xff0c;应用程序的代码在此模式下运行&#xff1b; 这两种新模式都比user mode有着更高的权限&#xff0c;有更多权限的模式通常可以使用…

深度学习中的13种概率分布

1 概率分布概述 共轭意味着它有共轭分布的关系。 在贝叶斯概率论中&#xff0c;如果后验分布 p&#xff08;θx&#xff09;与先验概率分布 p&#xff08;θ&#xff09;在同一概率分布族中&#xff0c;则先验和后验称为共轭分布&#xff0c;先验称为似然函数的共轭先验。 多…

Python实现多种图像锐化方法:拉普拉斯算子和Sobel算子

Python实现多种图像锐化方法&#xff1a;拉普拉斯算子和Sobel算子 图像和视频逐渐成为人们生活中信息获取的重要来源&#xff0c;而图像和视频在传输过程中有很多因素可能造成图像模糊&#xff0c;比如不正确的聚焦会产生离焦模糊&#xff0c;景物和照相机的相对运动会造成运动…

C# 编写Windows服务程序

1.什么是windows服务&#xff1f; Microsoft Windows 服务&#xff08;即&#xff0c;以前的 NT 服务&#xff09;使您能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序。这些服务可以在计算机启动时自动启动&#xff0c;可以暂停和重新启动而且不显示任何用…

基于自动化脚本批量上传依赖到nexus内网私服

前言 因为某些原因某些企业希望私服是不能连接外网的&#xff0c;所以需要某些开源依赖需要我们手动导入到nexus中&#xff0c;尽管nexus为我们提供了web页面。但是一个个手动导入显然是一个庞大的工程。 对此我们就不妨基于脚本的方式实现这一过程。 预期效果 笔者本地仓库…

IDEA之设置主题风格为eclipse风格

设置IDEA的主题风格为eclipse风格&#xff0c;步骤如下: 1.选择File->Settings 2.选择 Plugins 3.搜索 eclipse theme&#xff0c;注意是红框里的&#xff0c;点击 install 下载后就会自动设置这个主题 4.你也可以去修改主题&#xff0c;选择 Appearance&#xff0c;设置th…

deepstream-python安装

​ 安装deepstream-docker 在这边文章中deepstream-docker详细介绍了如何在Ubuntu下安装deepstream-docker&#xff0c;安装完成之后&#xff0c;为了快速入门deepstream&#xff0c;我们可以安装deepstream-python库&#xff0c;通过阅读相应的例子来快速搭建一个应用。 安…

认识loader和plugin

在 webpack 中&#xff0c;专注于处理 webpack 在编译过程中的某个特定的任务的功能模块&#xff0c;可以称为插件。它和 loader 有以下区别&#xff1a; 1loader 是一个转换器&#xff0c;将 A 文件进行编译成 B 文件&#xff0c;比如&#xff1a;将 A.less 转换为 A.css&…

IDEA之设置项目包的结构层级为eclipse默认样式

idea默认项目包的结构层级如下: 想修改成eclipse默认的那种样式&#xff0c;设置步骤如下: 1.点击下图中红框图标进行设置 2.选择 Tree Appearance&#xff0c;取消勾选 Compact Middle Packages 3.勾选红框里的两个选项&#xff0c;Flatten Packages 和 Hide Empty Middle Pa…

HTML插入视频和音频(详解)

&#x1f4cd;文章目录&#x1f4cd; &#x1f9c0;一&#xff0c;简介&#x1f9c0;二&#xff0c;视频(video)&#x1f367;1&#xff0c;普通的视频插入&#x1f367;2&#xff0c;在html5中嵌入视频网站视频 &#x1f9c0;三&#xff0c;音频(audio) &#x1f9c0;一&#…

50mA、24V、超低 IQ、低压降稳压器

一、Description The TPS715 low-dropout (LDO) voltage regulators offer the benefits of high input voltage, low-dropout voltage, low-power operation, and miniaturized packaging. The devices, which operate over an input range of 2.5 V to 24 V, are stable wit…

Wordle 游戏实现 - 使用 C++ Qt

标题&#xff1a;Wordle 游戏实现 - 使用 C Qt 摘要&#xff1a; Wordle 是一款文字猜词游戏&#xff0c;玩家需要根据给定的单词猜出正确的答案&#xff0c;并在限定的次数内完成。本文介绍了使用 C 和 Qt 框架实现 Wordle 游戏的基本思路和部分代码示例。 引言&#xff1a;…

jmeter简单压测kafka

前言 这也是一个笔记&#xff0c;就是计划用jmeter做性能测试&#xff0c;但是这里是只要将数据放到kafka的topic里&#xff0c;后面查看下游业务处理能力。 一、方案 因为只要实现数据放到kafka&#xff0c;参考了下博友的方案&#xff0c;可行。 二、方案验证 详细过程就不…

CNN 卷积神经网络之 DenseNet 网络的分类统一项目(包含自定义数据集的获取)

1. DenseNet 网络介绍 本章实现的项目是DenseNet 网络对花数据集的五分类&#xff0c;下载链接&#xff1a; 基于迁移学习的 DenseNet 图像分类项目 DenseNet 网络是在 ResNet 网络上的改进&#xff0c;大概的网络结构如下&#xff1a; 1.1 卷积的简单介绍 图像识别任务主要…

计算机速成课Crash Course - 10. 早期的编程方式

今天继续计算机速成课Crash Course的系列讲解。 更多技术文章&#xff0c;关注公众号 “摸鱼IT” 锁定 -上午11点 - &#xff0c;感谢大家关注、转发、点赞&#xff01; 10. 早期的编程方式 前几集我们把重点放在计算机的原理&#xff0c;怎么从内存读写数据&#xff0c;执行…

js基础:函数、对象、WebAPIs-DOM

一、函数和对象 1、函数概述 &#x1f916;chatgpt&#xff1a;什么是函数&#xff1f;为什么要有函数&#xff1f; 函数是一种可重复使用的代码块&#xff0c;它们可以接受输入&#xff08;参数&#xff09;、执行特定的任务&#xff0c;并返回结果。 JavaScript中函数是非常…