子程序应用(数制转换)程序设计

  • 一、实验目的
  • 二、实验内容
  • 三、设计思想
  • 四、程序代码
    • (一)进制转换代码
    • (二)最大值并输出
    • (三)最长字符串

一、实验目的

1)掌握程序设计中的子程序结构;
2)熟练使用过程伪指令、子程序调用和返回等汇编语言的指令编写子程序;
3)掌握数制转换方法;
4)掌握利用DOS系统功能调用进行字符输入及字符输出(显示)的方法。

二、实验内容

1、编写十进制到十六进制转换程序。要求从键盘取得一个十进制数,然后把该数以十六进制形式在屏幕上显示出来
2、已知从BUF开始存放了10个16进制字数据,编程求出这10个数中的最大数,(将最大数存入MAX字节单元),并将其以10进制数的形式在屏幕上显示出来。
(提示:以上两题都要求采用子程序的方法)
3、从键盘上输入一行字符,如果这行字符比前一次输入的一行字符长度长,则保存该行字符,然后继续输入另一行字符;如果它比前一次输入的行短,则不保存这行字符。按下‘ ’ 输 入 结 束 , 最 后 将 最 长 的 一 行 字 符 显 示 出 来 。 ( 选 作 ) ( 提 示 : 定 义 数 据 段 , 包 括 两 个 变 量 S T R I N G 和 B U F F E R , 格 式 如 下 : S T R I N G D B 0 ; 存 放 字 符 的 个 数 D B 80 D U P ( ? ) , 0 D H , 0 A H , ‘ ’输入结束,最后将最长的一行字符显示出来。(选作) (提示:定义数据段,包括两个变量STRING和BUFFER,格式如下: STRING DB 0 ;存放字符的个数 DB 80 DUP (?), 0DH,0AH,‘ ’输入结束,最后将最长的一行字符显示出来。(选作)(提示:定义数据段,包括两个变量STRING和BUFFER,格式如下:STRINGDB0;存放字符的个数DB80DUP(?),0DH,0AH,‘’;存放前一次输入的字符串,兼作显示缓冲区
BUFFER DB 80 ;输入字符串的缓冲区,最多输入80个字符
DB ?
DB 80 DUP (20H)
然后利用0AH号DOS系统功能调用收入字符,用09H号系统功能调用输出。)

三、设计思想

1.先调用子程序READ由键盘输入一个数字后,先减去30H把ASCII码形 式转换为二进制形式,保存在BX中。再调用子程序BINHEX,转换为十六进制 形式显示BX中的数。

2.利用子程序 MAXIMUM依次比较,将BUF中10个字的最大值放到BX中,并 存入MAX字节单元中。然后调用子程序ORIGIN先输出十六进制表示的最大值, 再调用CONVERY子程序依次除以10000,1000,100,10,分别把余数放到BX, 商放到DL,将DL中的值转换为ASCII码格式,最后调用2号功能输出结果。

3.在子程序READ中调用0AH功能,将输入字符放到缓冲区,之后输入的字符 串与显示缓冲区STRING的内容相比较,若BUFFER中的内容多于STRING中的 内容,则被替换,输入$即停止输入字符串。最长的字符串保存在STRING缓冲 区中,最后在OUTPUT子程序中调用9号功能输出最长字符串。

四、程序代码

(一)进制转换代码

DSEG SEGMENTMSG1 DB 0DH,0AH,'Please input a number:','$'MSG2 DB 0DH,0AH,'Result:','$'MSG3 DB 0DH,0AH,'$'
DSEG ENDS
CSEG SEGMENTMAIN PROC FARASSUME CS:CSEG,DS:DSEGSTART:PUSH DSXOR AX,AXPUSH AXMOV AX,DSEGMOV DS,AXCALL READ   ;调用输入子程序CALL BINHEX ;调用转换输出子程序CALL CRLF ;换行RETMAIN ENDP
;--------------------------
READ PROC NEARMOV BX,0  ;BX初始化为0LEA DX,MSG1MOV AH,09HINT 21H        ;输出提示字符串
INPUT:MOV AH,01HINT 21H     ;输入字符CMP AL,0DH ;是否是回车键JZ EXIT      ;是回车键就退出SUB AL,30H  ;是否小于0JB EXITCMP AL,09H ;是否大于9JA EXITCBW            ;扩展为字XCHG AX,BX     ;AX和BX交换MOV CX,0AH  MUL CX      ;将前面的数×10XCHG BX,AX     ;再次交换ADC BX,AX  ;加上目前位置的数JMP INPUT  ;再次输入
EXIT:RET
READ ENDP
;------------------------
BINHEX PROC NEARLEA DX,MSG2MOV AH,09HINT 21H        ;输出提示字符串MOV CL,4    ;每次移位4位MOV CH,4 ;循环4次
CHANGE:ROL BX,CL    ;循环左移4位MOV AX,BX    AND AL,0FH  ADD AL,30H  ;转为ASCII码CMP AL,39H     JBE OUTPUT  ;小于等于9直接输出ADD AL,07H    ;大于9再加07H
OUTPUT:MOV DL,ALMOV AH,02HINT 21H       ;输出单个字符DEC CH       ;循环计数-1JNZ CHANGE RET
BINHEX ENDP
;-------------------
CRLF PROC NEARLEA DX,MSG3MOV AH,09HINT 21HRET
CRLF ENDPCSEG ENDSEND START

(二)最大值并输出

DSEG SEGMENTBUF DW 05H,0FH,15H,1FH,9AH,25H,2AH,32H,3AH,3FHMAX DB ?   MSG1 DB 0DH,0AH,'MAX(DEC):','$'MSG2 DB 0DH,0AH,'MAX(HEX):','$'
DSEG ENDS
CSEG SEGMENTMAIN PROC FARASSUME CS:CSEG,DS:DSEGSTART:PUSH DSXOR AX,AXPUSH AXMOV AX,DSEGMOV DS,AXCALL MAXIMUM    ;调用计算最大值子程序CALL ORIGIN      ;调用输出原数据子程序CALL CONVERY ;调用输出十进制数据子程序RETMAIN ENDP;-----------------MAXIMUM PROC NEARMOV BX,0        ;偏移量MOV CX,9        ;循环比较9次MOV AX,BUF[BX]   COMP:ADD BX,2       ;偏移量+2CMP AX,BUF[BX]   ;比较两个数JA NEXT           ;原数据更大则下一个MOV AX,BUF[BX]    ;更换最大值NEXT:LOOP COMPMOV BX,AX       MOV MAX,AL      ;最大值存入MAX存储单元RETMAXIMUM ENDP;-------------------ORIGIN PROC NEARLEA DX,MSG2MOV AH,09HINT 21H            ;输出提示字符串MOV BL,MAXMOV CL,4      ;移位4位MOV CH,2       ;循环2次REPEAT:ROL BL,CL       ;循环左移4位MOV AL,BL        AND AL,0FH      ADD AL,30H      ;转换ASCIICMP AL,39HJBE LAST      ;不大于9则直接输出ADD AL,07H        ;大于9再加07HLAST:MOV DL,ALMOV AH,02HINT 21H            ;输出DEC CH           ;计数-1JNZ REPEAT     RETORIGIN ENDP;----------------
CONVERY PROC NEARLEA DX,MSG1MOV AH,09HINT 21H           ;输出提示字符MOV CX,100d      CALL DIVD       ;调用DIVD子程序MOV CX,10dCALL DIVDMOV CX,1dCALL DIVDRET
CONVERY ENDP
;-----------------
DIVD PROC NEARMOV AX,BX     MOV DX,0DIV CX          ;除以CX的值MOV BX,DX        ;余数存入BXMOV DL,AL        ;商存入DLADD DL,30H        ;转换为ASCIIMOV AH,02HINT 21H          ;输出RET
DIVD ENDP
CSEG ENDSEND START

(三)最长字符串

DSEG SEGMENTSTRING  DB 0 ;存放字符的个数DB 80 DUP (?), 0DH,0AH,'$'    ;存放前一次输入的字符串,兼作显示缓冲区BUFFER  DB 80    ;输入字符串的缓冲区,最多输入80个字符DB ?DB 80 DUP (20H)RESULT  DB 0DH,0AH,'LONGEST STRING:','$'
DSEG ENDS
CSEG SEGMENTMAIN PROC FARASSUME CS:CSEG,DS:DSEG,ES:DSEG
START:PUSH DSXOR AX,AXPUSH AXMOV AX,DSEGMOV DS,AXMOV ES,AXCALL READ     ;调用输入子程序    CALL OUTPUT     ;调用输出子程序RETMAIN ENDP;-----------------------
READ PROC NEAR
REPEAT:MOV AH,02HMOV DL,0DHINT 21H          ;回车MOV AH,02HMOV DL,0AHINT 21H          ;换行LEA DX,BUFFERMOV AH,0AHINT 21H           ;键盘键入缓冲区MOV AL,BUFFER[2];取出第一个字符CMP AL,'$'        ;与$比较JNZ COMP       ;不是结束去比较JMP EXIT        ;是就结束输出
COMP:MOV AL,BUFFER[1];取出实际字符数CMP AL,STRING[0];与最长字符数比较JB REPEAT     ;比前一次短重新输入MOV STRING[0],AL;更长就更新最长字符数LEA SI,BUFFER[2]LEA DI,STRING[1]MOV CH,0MOV CL,BUFFER[1]CLDREP MOVSB       ;输入的最长字符串存入STRINGJMP REPEAT     ;再次输入
EXIT:RET
READ ENDP
;------------------------
OUTPUT PROC NEARLEA DX,RESULTMOV AH,09HINT 21H          ;输出提示字符串LEA DX,STRING[1]MOV AH,09HINT 21H           ;输出最长字符串RET
OUTPUT ENDP
;-------------------------CSEG ENDSEND START

汇编语言-- 实验三 子程序应用(数制转换)程序设计相关推荐

  1. [汇编语言]实验三:栈和栈段

    实验三 实验内容: (1) (2) (3) (4) (5) (6)

  2. 20172305 2017-2018-2 《程序设计与数据结构》实验三报告

    20172305 2017-2018-2 <程序设计与数据结构>实验三报告 课程:<程序设计与数据结构> 班级: 1723 姓名: 谭鑫 学号:20172305 实验教师:王志 ...

  3. 20172332 2017-2018-2 《程序设计与数据结构》实验三报告

    20172332 2017-2018-2 <程序设计与数据结构>实验三报告 课程:<程序设计与数据结构> 班级: 1723 姓名: 于欣月 学号:20172332 实验教师:王 ...

  4. 20172324 2017-2018-2《程序设计与数据结构》实验三报告

    20172324 2017-2018-2<程序设计与数据结构>实验三报告 课程:<程序设计与数据结构> 班级: 1723 姓名: 曾程 学号:20172324 实验教师:王志强 ...

  5. python面向对象实验报告_20192310 实验三《Python程序设计》实验报告

    学号 2020-2021-1 <数据结构与面向对象程序设计>实验三报告 课程:<程序设计与数据结构> 班级: 1923 姓名: 严嘉钰 学号:20192310 实验教师:王志强 ...

  6. 20182326 2019-2020-1 《数据结构与面向对象程序设计》实验三报告

    20182326 2019-2020-1 <数据结构与面向对象程序设计>实验三报告 课程:<程序设计与数据结构> 班级: 1823 姓名: 刘颖洁 学号:20182326 实验 ...

  7. 利用c51进行数模转换并在液晶屏上显示_51单片机汇编语言实验(五)-----A/D 0809模数转换和DA0832数模转换实验(附参考代码及注释)...

    本系列共6篇文章,本文作为本系列的第五篇文章,介绍实验五 :A/D 0809模数转换和DA0832数模转换实验,本系列文章基于Dais-52PRO实验箱. 本系列文章链接: ------------- ...

  8. zp2ss matlab,控制系统计算机仿真(matlab)实验三实验报告

    实验三 控制系统数学模型及其转换 一.实验目的 1.掌握控制系统常用数学模型Matlab 表示 2.利用Matlab 实现数学模型之间的转换 二.实验学时:2学时 三.实验原理 1.已知传递函数模型: ...

  9. c语言实验指导书答案第三章,《C语言程序设计》实验指导书答案

    printf(\ else printf(\ } system(\ } 4. #include #include #define pi 3.14 main( ) { float r; printf(\ ...

最新文章

  1. 澳大利亚悉尼科技大学招收人工智能/软件工程方向全奖博士生
  2. C# 操作redis
  3. 网页编程从入门到精通 杨凡_干货 | web前端入门基础知识
  4. WordPress七牛云镜像存储插件
  5. div不继承父类样式_Java三大特性之继承
  6. jquery点击按钮显示和隐藏div
  7. cvMat结构体详解
  8. 201503-1-图像旋转
  9. HTML 转 PDF的两种实现方式
  10. nssa和stub_ospf协议stub和nssa区域说明
  11. 为赢过老婆打造自动瞄准弓,闭眼也能百发百中,零件电路算法全自制
  12. 【Word文稿】在Word中优雅地插入VScode颜色主题代码(高亮、背景、颜色、字体均完美)
  13. 华硕路由器官改/梅林 设置外置USB-JFFS解救NAND
  14. windows server 2016 活动目录部署系列(十一)AD域控上安装证书服务器
  15. 【Google Chrome】如何让浏览器显示手机网页
  16. LeetCode-1694. 重新格式化电话号码【字符串,分块】
  17. s11 day103 luffy项目结算部分+认证+django-redis
  18. React State
  19. 使用Arthas快速定位SpringBoot接口超时问题的神器
  20. spring-rabbit的使用

热门文章

  1. 运动性能强的蓝牙耳机,四款运动蓝牙耳机
  2. SpringBoot 发布 WebService
  3. floyd算法-matlab
  4. JSON与JS之间的相互转换
  5. python 学习 制作英文学习字典 DAY23
  6. python手游脚本自动采集_Python脚本结合UiAutomator自动化采集Activity的FPS
  7. java 遍历request_java 遍历request中的所有表单数据的实例代码
  8. [GDOI模拟2015.08.12]囚人的旋律
  9. 百度人工智能篇,飞桨EasyDL零门槛AI开发平台1
  10. navicat for mysql命令行_详解 Navicat for MySQL 命令工具