汇编实验3 子程序汇编实验学习和提高

目录

【实验要求】  

【实验具体内容】

一、Debug -P 和-G命令

二、十六进制数转换成十进制数

三、闰年程序学习

四、汇编实例学习和改进:两数加法

【课堂补充】

【实验要求】  

1. 复习一下 Debug -P 和-G命令

2.将键盘上输入的十六进制数转换成十进制数,并在屏幕上显示。(编写程序,详细注释并画程序流程图)

3. 较为复杂的汇编实例学习:判断该年是否为闰年(通过注释重点学习并理解程序,画出程序的流程图,在理解的基础上,如果觉得程序的写法需要修改也可以自行修改)

4.汇编实例学习和改进:两位数加法

【实验具体内容】

一、Debug -P 和-G命令

1.在dosbox中,使用r命令设置CS=0C52 IP=0100,如图所示。

2.使用-a指令,输入如图所示的代码。 

3.使用-g命令,输入-g =0100 0105,观察到IP变为-g命令设置的断点,0105.

 

 

二、十六进制数转换成十进制数

1.流程图

2.源代码

DATAS SEGMENT ;定义数据段代码

        STR1 DB 'Please enter a hexadecimal number',10,'$';定义提示字符串,该字符串被输出到屏幕时,换行,在这里通常用作字符串的结束符,告诉程序该字符串在哪里结束。

        STR2 DB 10,'Please enter a right number',10,'$';定义错误提示字符串,输出错误提示之前会先换行

DATAS ENDS ;数据段结束

STACKS SEGMENT STACK栈段开始

        DW 8 DUP(?) ;保留8个字变量的位置  在栈段中定义了8个字的未初始化存储空间。即预留了16字节的空间。保留固定大小的栈空间可以防止栈溢出,通过预先分配足够的空间,程序在运行时不会因为栈空间不足而崩溃。

STACKS ENDS;栈段结束

CODES SEGMENT;代码段开始

ASSUME CS:CODES,DS:DATAS,SS:STACKS;伪指令assume确定段与段寄存器之间的对应关系

START: ;主程序开始

        MOV AX,DATAS;将数据段位置存到AX

        MOV DS,AX ;将数据段的地址赋给DS

        MOV AX,STACKS;将栈段位置存到AX

        MOV SS,AX ;将栈的段地址赋给SS

        MOV SP,20H ;指出栈顶 20H(即32的十六进制表示)。栈段只分配了少量的空间,通过DW 8 DUP(?)只分配了16字节。将栈顶设置在一个接近栈底的位置是合理的,以防止栈溢出。

        LEA DX,STR1 ;利用LEA直接将STR1的内容赋值到DX中

        MOV AH,9H ;中断

        INT 21H ;输出提示字符串

        MOV BX,0 ;BX初始化为0

INPUT:;读入并等待输入字符/无条件跳转

        MOV AH,1H;向量号为1,单步中断

        INT 21H ;从键盘上输入一个字符,将其对应字符的ASCII码送入AL中,并在屏幕上显示该字符

        ADD DX,1 ;更新字符串位置  DX 寄存器在开始时被设置为指向提示字符串 STR1 的起始地址。随着用户输入字符,程序需要更新 DX 以指向字符串中下一个位置,这样它就可以正确地处理或显示字符。ADD DX,1 指令就是用来完成这个任务的。每次字符被处理或显示后,DX 就会增加 1,指向下一个字节位置。

        CMP AL,0DH;比较AL和回车

        JE HH ;若判断结果相等,即输入回车时则跳转至HH

JUDGE: ;根据输入16进制字符不同类型跳转(ASCII码大小f>a>F>A>9>0)

        CMP AL,'f' ;比较输入的字符和f的ASCII码大小

        JA ERROR ;无符号大于则跳转至ERROR

        CMP AL,'a'  ;比较AL和a

        JNB SIT1 ;无符号不小于则跳转至 SIT1

        CMP AL,'F' ;判断输入的字符是否是A~F

        JA ERROR ;无符号大于则跳转至ERROR

        CMP AL,'A'  ;比较AL和A

        JNB SIT2 ;无符号不小于则跳转至SIT2

        CMP AL,'9' ;判断输入的字符是否是1~9

        JA ERROR ;无符号大于则跳转至ERROR

        CMP AL,'0'  ;比较AL和0

        JNB SIT3 ;无符号不小于则跳转至SIT3

        JMP ERROR ;跳转至ERROR处

SIT1:   ;利用aacii码将16进制a—f aacii码转化为10-15

        SUB AL,57H ;若位于a—f 之间,则AL-57H

        JMP TRA ;无条件跳转至TRA

SIT2:   ;将16进制A-F aacii码 转化为10-15

        SUB AL,37H ;若位于A-F 之间,则AL-37H

        JMP TRA ;无条件跳转至TRA

SIT3:   ;将16进制0-9  aacii码转化为0-9

        SUB AL,30H ;若为0—9,则AL-30H

       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值