《微型计算机原理及应用》作业
作 业 组 别:
班 级:
姓 名:
学 号:
作业指导教师:
作业完成时间:
目录
一、二十五题……………………………………………………………………………3
1、分析及主要思路…………………………………………………………………..3
2、寄存器、主存应用………………………………………………………………..3
3、程 序 框 图…………………………………………………………………..3
4、主 要 程 序…………………………………………………………………..3
5、调试、结果分析…………………………………………………………………..4
二、四十九题…………………………………………………………………………..4
1、分析及主要思路…………………………………………………………………..4
2、寄存器、主存应用………………………………………………………………..4
3、程 序 框 图…………………………………………………………………..4
4、主 要 程 序…………………………………………………………………..5
5、调试、结果分析…………………………………………………………………..6
三、九十三题……………………………….…………………………………………..6
1、分析及主要思路…………………………………………………………………..6
2、寄存器、主存应用………………………………………………………………..6
3、程 序 框 图…………………………………………………………………..6
4、主 要 程 序…………………………………………………………………..7
5、调试、结果分析…………………………………………………………………..8
四、体会和建议………………………………………………………………………..9
25、编写一个完整的汇编程序,统计以DATA1为首址的数据存储器中存放的一个数据块(以FFH为结束符)的长度(即字节数),不包括结束符FFH,且长度小于256,将其存于CONT单元中。
1、分析及主要思路:本题主要进行的是进行以data1为首地址的数据块的字节数的计算,我的主要思路是每一次顺序取数据块中的一个数据和0ffh比较,如果相等,则结束比较,如果不等则继续进行比较,直到相等为止,定义cont变量为0,每进行一次比较cont的值加一,最终实现数据块字节数的统计。
2、寄存器、主存使用情况:将要求的字符串存入主存,将字符串首地址给si寄存器,将字符串比较次数给al寄存器,将最终得到的字符串字节数给主存。
3、程序框图:
4、主要程序如下:
.model small
.stack
.data
data1 db 'asdfghjkl',0ffh ;定义变量
cont db 00h ;赋cont初值为零
.code
start: mov ax,@data ;程序开始
mov ds,ax
mov si,offset data1 ;将data1的首地址赋予si
mov al,0 ;赋al初值为零
L_start:cmp byte ptr[si],0ffh ;将【si】中的数据和0ffh进行比较
je next ;相等跳到next
add al,1 ;不相等将al+1
inc si ;si+1
jmp L_start ;跳回L_start
next: mov cont,al ;将al数值赋予cont,实现计数
mov ax,4c00h
int 21h
end start
5、调试、结果:这个程序是第一个自己编的程序,在调试初期,出现了把offset写成offest,把mov写成move这样的低级错误,经过改正后,观察变量窗最终调试结果和预测相同,将变量给为“asdfghjkl”再次进行调试,最终调试结果也和预测相同。
49、若从source单元开始有100个数,编一个程序检查这些数,正数保持不变,负数取补后送至result单元开始的存储区。
1、分析及主要思路:本题主要进行主存中存入的100个有符号数的正负值检查,并将这些数据中的正值直接存入result开始的存储区,负数取补后再存入result单元开始的存储区。要实现目的操作,可以利用cmp指令将数据与零作比较,比零小的取补放入内存单元,比零大的直接存入内存单元。将cx赋值为100,使用loop语句,实现100个数的检查。
2、寄存器、主存使用情况:将要求的字符串存入主存,将source字符串首地址给si,将result字符串首地址给di,将cx寄存器赋值为100,将正数或负数取补后放入result主存。
3、程序框图:
4、主程序如下:
.model small
.stack
.data
Source db 10 dup(45h,12h,23h,09h,13h,20h,39h,84h,20h,89h) ;定义变量source result db 100 dup(?) ;为result预留100个空间
.code
start:mov ax,@data ;程序开始
mov ds,ax
mov di,offset source ;将source首地址赋给di
mov si,offset result ;将result首地址赋给si
mov cx,64h ;赋cx初值为100,实现loop的100次检查
again:mov al,[di] ;将di中的值赋给al
cmp al,0 ;将al与0作比较
jl next ; 比零低跳入next
mov [si],al ;不小于零将di中数据放入result
inc di ;di+1
inc si ;si+1
loop again ;loop循环
next: neg al ;为al取补
mov [si],al ;将al中数据放入result
inc di ;di+1
inc si ;si+1
loop again ;进入loop循环
mov ax,4c00h
int 21h
end start
5、调试与结果:在进行调试的初期只给result预留了一个空间,在编程的过程中进行改正,最终程序实现了正数直接存入,负数取补后存入的功能,实现了预期的结果。
93、编写子程序。比较两个字节型数据块。其中,第一个数据块的首地址存放于SI中,第二个数据块的首地址存放于DI中,CX中存放比较的字节个数。若两个数据块完全匹配,则置CF=0,返回;否则,置CF=1,并将不匹配的单元地址存放于DI中返回。主程序调用子程序实现上述功能。
1、分析及主要思路:此题要求进行字节型数据块的比较,可以使用cmp指令实现预期结果。首先,将定义后的数据块变量顺序进行比较,相同时进行下一项的比较,不相同时结束程序,此时的di中的地址即为不匹配的单元地址。记录此时的比较的次数,即为比较的字节数,利用stc和clc指令实现cf进位标志的设置。
2、寄存器、主存使用情况:在主存中存入source1,source2两个数据块,将source1和source2中的数据存入si和di中。在cx中记录字节数。dx进行比较次数的记录。
3、程序框图如下:
4、主要程序如下:
.model small
.stack
.data
source1 db 'asdfgh';定义变量
N = $ - source1;获得字符所占字节数
source2 db 'agdffgh' ;定义变量
.code
start: mov ax,@data
mov ds ,ax
lea si,source1 ;将source1偏移地址给si
lea di,source2 ;将source2偏移地址给di
mov cx,n ;赋cx初值为source所占字节数
mov dx,0 ;赋dx初值为零
call compare ;调用子程序
mov ah,4ch
int 21h
compare proc
l1: mov al,[si] ;取出一个字符给al
cmp al,[di] ;两字符进行比较
je next ;相等跳到next
mov cx,dx ;将比较的次数赋予cx
stc ;置位进位标志
ret ;退出子程序
next:inc si ;si+1
inc di;di+1
inc dx ;dx+1
loop l1 ;重复循环
mov cx,dx ;将比较的次数赋予cx
clc ;复位进位标志
ret;
compare endp
end start
5、调试与结果:在最初进行编程的过程中,我只单纯的用了cmp指令进行数据的比较,实现了数据的比较和比较字节数的记录,但是没有实现在数据完全相同时cf置0,不同时cf置1。在老师的帮助下,我在程序中加入了clc和stc指令,最后进行调试时结果完全和题目相符,更换了多组数据后也能完成汇编要求。
体会和建议
在汇编的过程中,一开始我发现自己的思路很僵硬,基础知识掌握很不好,对自己的程序进行反复修改的过程中,我的基础知识掌握的更牢固了,对于很多在理论学习中不懂的地方,都搞明白了,对于很多功能能够进行融会贯通。我发现一个要求可以有很多指令实现,殊途同归。比如,第一题我要计算数据块的长度,我的主要思路是通过进行每一位与0ffh的比较对比较的次数进行统计,实现字节的计算,而在做第三题的时候,我发现直接利用$-source和lengthof进行计算即可,十分简单。
微机的功能是十分强大的,可以实现很多功能。我们熟练的掌握微机原理的各种知识,可以高效的进行各种程序的设计。然而仅仅进行理论知识的掌握是远远不够的,我们要更多的进行实践,实现理论和实践相结合。建议能够更多的安排一些上机课,使学生能够更多的进行实践操作。
《微型计算机原理及应用》作业
作 业 组 别:
班 级:
姓 名:
学 号:
作业指导教师:
作业完成时间:
目录
一、二十五题……………………………………………………………………………3
1、分析及主要思路…………………………………………………………………..3
2、寄存器、主存应用………………………………………………………………..3
3、程 序 框 图…………………………………………………………………..3
4、主 要 程 序…………………………………………………………………..3
5、调试、结果分析…………………………………………………………………..4
二、四十九题…………………………………………………………………………..4
1、分析及主要思路…………………………………………………………………..4
2、寄存器、主存应用………………………………………………………………..4
3、程 序 框 图…………………………………………………………………..4
4、主 要 程 序…………………………………………………………………..5
5、调试、结果分析…………………………………………………………………..6
三、九十三题……………………………….…………………………………………..6
1、分析及主要思路…………………………………………………………………..6
2、寄存器、主存应用………………………………………………………………..6
3、程 序 框 图…………………………………………………………………..6
4、主 要 程 序…………………………………………………………………..7
5、调试、结果分析…………………………………………………………………..8
四、体会和建议………………………………………………………………………..9
25、编写一个完整的汇编程序,统计以DATA1为首址的数据存储器中存放的一个数据块(以FFH为结束符)的长度(即字节数),不包括结束符FFH,且长度小于256,将其存于CONT单元中。
1、分析及主要思路:本题主要进行的是进行以data1为首地址的数据块的字节数的计算,我的主要思路是每一次顺序取数据块中的一个数据和0ffh比较,如果相等,则结束比较,如果不等则继续进行比较,直到相等为止,定义cont变量为0,每进行一次比较cont的值加一,最终实现数据块字节数的统计。
2、寄存器、主存使用情况:将要求的字符串存入主存,将字符串首地址给si寄存器,将字符串比较次数给al寄存器,将最终得到的字符串字节数给主存。
3、程序框图:
4、主要程序如下:
.model small
.stack
.data
data1 db 'asdfghjkl',0ffh ;定义变量
cont db 00h ;赋cont初值为零
.code
start: mov ax,@data ;程序开始
mov ds,ax
mov si,offset data1 ;将data1的首地址赋予si
mov al,0 ;赋al初值为零
L_start:cmp byte ptr[si],0ffh ;将【si】中的数据和0ffh进行比较
je next ;相等跳到next
add al,1 ;不相等将al+1
inc si ;si+1
jmp L_start ;跳回L_start
next: mov cont,al ;将al数值赋予cont,实现计数
mov ax,4c00h
int 21h
end start
5、调试、结果:这个程序是第一个自己编的程序,在调试初期,出现了把offset写成offest,把mov写成move这样的低级错误,经过改正后,观察变量窗最终调试结果和预测相同,将变量给为“asdfghjkl”再次进行调试,最终调试结果也和预测相同。
49、若从source单元开始有100个数,编一个程序检查这些数,正数保持不变,负数取补后送至result单元开始的存储区。
1、分析及主要思路:本题主要进行主存中存入的100个有符号数的正负值检查,并将这些数据中的正值直接存入result开始的存储区,负数取补后再存入result单元开始的存储区。要实现目的操作,可以利用cmp指令将数据与零作比较,比零小的取补放入内存单元,比零大的直接存入内存单元。将cx赋值为100,使用loop语句,实现100个数的检查。
2、寄存器、主存使用情况:将要求的字符串存入主存,将source字符串首地址给si,将result字符串首地址给di,将cx寄存器赋值为100,将正数或负数取补后放入result主存。
3、程序框图:
4、主程序如下:
.model small
.stack
.data
Source db 10 dup(45h,12h,23h,09h,13h,20h,39h,84h,20h,89h) ;定义变量source result db 100 dup(?) ;为result预留100个空间
.code
start:mov ax,@data ;程序开始
mov ds,ax
mov di,offset source ;将source首地址赋给di
mov si,offset result ;将result首地址赋给si
mov cx,64h ;赋cx初值为100,实现loop的100次检查
again:mov al,[di] ;将di中的值赋给al
cmp al,0 ;将al与0作比较
jl next ; 比零低跳入next
mov [si],al ;不小于零将di中数据放入result
inc di ;di+1
inc si ;si+1
loop again ;loop循环
next: neg al ;为al取补
mov [si],al ;将al中数据放入result
inc di ;di+1
inc si ;si+1
loop again ;进入loop循环
mov ax,4c00h
int 21h
end start
5、调试与结果:在进行调试的初期只给result预留了一个空间,在编程的过程中进行改正,最终程序实现了正数直接存入,负数取补后存入的功能,实现了预期的结果。
93、编写子程序。比较两个字节型数据块。其中,第一个数据块的首地址存放于SI中,第二个数据块的首地址存放于DI中,CX中存放比较的字节个数。若两个数据块完全匹配,则置CF=0,返回;否则,置CF=1,并将不匹配的单元地址存放于DI中返回。主程序调用子程序实现上述功能。
1、分析及主要思路:此题要求进行字节型数据块的比较,可以使用cmp指令实现预期结果。首先,将定义后的数据块变量顺序进行比较,相同时进行下一项的比较,不相同时结束程序,此时的di中的地址即为不匹配的单元地址。记录此时的比较的次数,即为比较的字节数,利用stc和clc指令实现cf进位标志的设置。
2、寄存器、主存使用情况:在主存中存入source1,source2两个数据块,将source1和source2中的数据存入si和di中。在cx中记录字节数。dx进行比较次数的记录。
3、程序框图如下:
4、主要程序如下:
.model small
.stack
.data
source1 db 'asdfgh';定义变量
N = $ - source1;获得字符所占字节数
source2 db 'agdffgh' ;定义变量
.code
start: mov ax,@data
mov ds ,ax
lea si,source1 ;将source1偏移地址给si
lea di,source2 ;将source2偏移地址给di
mov cx,n ;赋cx初值为source所占字节数
mov dx,0 ;赋dx初值为零
call compare ;调用子程序
mov ah,4ch
int 21h
compare proc
l1: mov al,[si] ;取出一个字符给al
cmp al,[di] ;两字符进行比较
je next ;相等跳到next
mov cx,dx ;将比较的次数赋予cx
stc ;置位进位标志
ret ;退出子程序
next:inc si ;si+1
inc di;di+1
inc dx ;dx+1
loop l1 ;重复循环
mov cx,dx ;将比较的次数赋予cx
clc ;复位进位标志
ret;
compare endp
end start
5、调试与结果:在最初进行编程的过程中,我只单纯的用了cmp指令进行数据的比较,实现了数据的比较和比较字节数的记录,但是没有实现在数据完全相同时cf置0,不同时cf置1。在老师的帮助下,我在程序中加入了clc和stc指令,最后进行调试时结果完全和题目相符,更换了多组数据后也能完成汇编要求。
体会和建议
在汇编的过程中,一开始我发现自己的思路很僵硬,基础知识掌握很不好,对自己的程序进行反复修改的过程中,我的基础知识掌握的更牢固了,对于很多在理论学习中不懂的地方,都搞明白了,对于很多功能能够进行融会贯通。我发现一个要求可以有很多指令实现,殊途同归。比如,第一题我要计算数据块的长度,我的主要思路是通过进行每一位与0ffh的比较对比较的次数进行统计,实现字节的计算,而在做第三题的时候,我发现直接利用$-source和lengthof进行计算即可,十分简单。
微机的功能是十分强大的,可以实现很多功能。我们熟练的掌握微机原理的各种知识,可以高效的进行各种程序的设计。然而仅仅进行理论知识的掌握是远远不够的,我们要更多的进行实践,实现理论和实践相结合。建议能够更多的安排一些上机课,使学生能够更多的进行实践操作。