目录
【实验要求】
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

最低0.47元/天 解锁文章
1626

被折叠的 条评论
为什么被折叠?



