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

news/2024/7/7 22:38:46

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

环境: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


http://lihuaxi.xjx100.cn/news/1890211.html

相关文章

WSL的导出与导入

1需求 现在我需要把我在平板上配好的系统导出来,再放到我的笔记本上。 2基本情况 笔记本电脑没装过wsl 平板上配好了wsl,并且里面的ubuntu配好了python环境。 3从平板导出 比较顺利 先关机。 wsl --shutdown 这里后两个我用不到,因为…

Python核心编程之文件和输入输出

目录 一、文件对象 二、 文件内建函数[open()和file()] 1、工厂函数 file() 2、通用换行符支持(UNS)

java并发-ReentrantReadWriteLock读写锁

文章目录 介绍读写锁的获取规则示例源码解读ReentrantReadWriteLock核心变量ReentrantReadWriteLock相关属性和构造函数Sync静态内部类的核心属性tryAcquireShared方法tryAcquire方法锁降级 总结 介绍 读写锁就是将一个锁拆分为读锁和写锁两个锁。 读写锁的获取规则 如果有一…

postgreSql服务的window启动

CMD启动服务: D:\PostgreSQL\bin pg_ctl register -N PostgreSQL -D "D:\PostgreSQL\data # 登录 psql -U postgres # 验证输入 select 1; 拓展:删除服务 sc delete 服务名称 PostgreSQLUSER: postgresPWD: rootPORT: 5432动PostgreSQL服务器 3.1 打…

关于“Python”的核心知识点整理大全18

目录 ​编辑 8.5 传递任意数量的实参 pizza.py 8.5.1 结合使用位置实参和任意数量实参 8.5.2 使用任意数量的关键字实参 user_profile.py 8.6 将函数存储在模块中 8.6.1 导入整个模块 pizza.py making_pizzas.py 8.6.2 导入特定的函数 8.6.3 使用 as 给函数指定别名…

现代信号处理实验:MATLAB实现多分量信号的WV分布和模糊函数的绘制

MATLAB实现多分量信号的WV分布和模糊函数的绘制 时域信号的傅氏谱(傅里叶变换频谱)、能量谱、功率谱都是信号变换到频域的一种表示,对于频谱不随时间变换的确定性信号和平稳随机信号而言,在频域分析中都可以很好的对信号进行分析…

后台业务管理系统原型模板,Axure后台组件库(整套后台管理页面)

后台业务系统需要产品经理超强的逻辑思维能力和业务理解能力,整理了一批后台原型组件及完整的用 Axure 8 制作的后台系统页面,方便产品经理们快速上手制作后台原型。 包括交互元件、首页、商品、订单、库存、用户、促销、运营、内容、统计、财务、设置、…

【PTA刷题】求链式线性表的倒数第K项(代码+详解)

文章目录 题目代码详解 题目 给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字。 输入格式: 输入首先给出一个正整数K,随后是若干非负整数,最后以一个负整数表示结尾(该负数不算在序列内&#…