微机原理实验报告
班级,无85班
学号,981157
姓名,尹晓东
实验目的熟悉pentium微处理器指令系统和寻址方式掌握汇编语言程序的编程与调试方法实验内容结合作业第二题熟悉pentium微处理器实模式下算术与逻辑运算指 令的功能,用debug逐条观察各个指令执行前后的相关寄存器的标志 位的变化。
masm6.11的使用和汇编语言程序的调试下列程序的功能是求一组十进制无符号数(2位数)的最大值,读懂该程序。(见附录)
用masm6.11汇编上述程序用debug跟踪,调试上述程序用u命令列出反汇编程序,与源程序清单比较跟踪到语句12,检查语句执行后ds寄存器的变化语句12执行后,发命令d ds:0,检查显示的内容是否与程序数据段定义的单元内容一致。
继续跟踪程序,检查程序执行过程中ax,dx等寄存器的变化将程序的功能改为求最小数如果block单元存的数据是压缩bcd码,修改上述程序。
实验报告要求
画出实验内容2中程序的框图
将实验内容2程序的block单元存放的数据改为压缩bcd码,列出修改后的程序清单。
实验内容3的程序说明和程序清单
实验数据及结果求最大数的程序框图
2,将程序中的存储数改为压缩BCD码
data segment para
block db 52h,14h,56h,85h,34h
db 63h,38h,70h,18h,69h
count equ $-offset block
max db 1 dup(?)
data ends
cseg segment
assume cs:cseg,ds:data
start proc far
mov ax,data
mov ds,ax
mov si,offset block
mov bx,offset max
mov cx,count
mov dl,[si]
inc si
dec cx
mov ah,0
mov dh,0
comp,lodsb
cmp dx,ax
jg next
mov dl,al
next,loop comp
mov [bx],dl
print,mov bx,offset max
mov dl,[bx]
mov cl,4
shr dl,cl
add dl,30h
mov ah,2
int 21h
mov dl,[bx]
and dl,0fh
add dl,30h
mov ah,2
int 21h
mov ah,4ch
int 21h
ret
start endp
cseg ends
end start
3,计算二位无符号数的平方
data segment ;数据段
string db 'Input a number $'
errstr db 0dh,0ah,'Error! Please input two digit!',0dh,0ah,'$'
resstr db 0dh,0ah,'The square is $'
data ends;********************************************************
code segment ;代码段
assume cs:code,ds:data
start:
main proc far
push ds ;数据段寄存器初始化
sub ax,ax
push ax
mov ax,data
mov ds,ax
mov dx,offset string
mov ah,09h ;显示Input a number
int 21h
mov ah,01h ;输入高位
int 21h
sub al,30h
cmp al,0
jl error
cmp al,9
jg error
mov cl,10d ;高位乘10
mul cl
mov bl,al
mov ah,01h ;输入低位
int 21h
sub al,30h
cmp al,0
jl error
cmp al,9
jg error
add al,bl ;转化为十六进制数
mul al ;求平方
mov bx,ax
call hex_dec ;十进制显示
jmp exit
error,mov dx,offset errstr ;输入非0—9的字符,显示Error
mov ah,09h
int 21h
exit,ret
main endp;---------------------------------------------------------------------
hex_dec proc near ;将BX中的十六进制数以十进制显示
mov dx,offset resstr
mov ah,09h
int 21h
mov si,0 ;SI用于做标记,以避免显示高位的零
mov cx,1000d
call dec_div ;千位
mov cx,100d
call dec_div ;百位
mov cx,10d
call dec_div ;十位
mov cx,1d
call dec_div ;个位
cmp si,0 ;输入的数为零,防止无显示
jne exit2
mov dl,30h
mov ah,2
int 21h
exit2,ret
hex_dec endp;--------------------------------------------------------------------
dec_div proc near
mov ax,bx
mov dx,0
div cx ;dx,ax div cx
mov bx,dx ;余数存入bx
cmp si,0 ;检查标志si决定是否显示
jnz print
cmp al,0
jz exit1
mov si,1 ;出现非零数,si置1
print,mov dl,al
add dl,30h
mov ah,02h ;显示
int 21h
exit1,ret
dec_div endp;----------------------------------------------------------------------
code ends;*************************************************************
end start