77a4d027abde47db90f494a46a536d aa doc Created on l1/3/19999:42:00PM 微机原理实验报告 班级:无85班 学号:981157 姓名:尹晓东 实验目的 .熟悉 pentium微处理器指令系统和寻址方式 2.掌握汇编语言程序的编程与调试方法 实验内容 1.结合作业第二题熟悉 pentium微处理器实模式下算术与逻辑运算指令的功 能,用 debug逐条观察各个指令执行前后的相关寄存器的标志位的变化 2.masm6.11的使用和汇编语言程序的调试 1)下列程序的功能是求一组十进制无符号数(2位数)的最大值,读懂该程 序。(见附录) 2)用masm6.11汇编上述程序 3)用 debug跟踪,调试上述程序 ◆用u命令列出反汇编程序,与源程序清单比较 跟踪到语句12,检查语句执行后ds寄存器的变化 ◆语句12执行后,发命令dds:0,检查显示的内容是否与程序数据段 定义的单元内容一致。 ◆继续跟踪程序,检査程序执行过程中ax,dx等寄存器的变化 4)将程序的功能改为求最小数 5)如果 block单元存的数据是压缩bcd码,修改上述程序。 实验报告要求 1.画出实验内容2中程序的框图 2.将实验内容2程序的 block单元存放的数据改为压缩bcd码,列出修改后 的程序清单。 3.实验内容3的程序说明和程序清单 第1页
77a4d027abde47db90f494a46a536daa.doc Created on 11/3/1999 9:42:00 PM 第 1 页 微机原理实验报告 班级: 无 85 班 学号: 981157 姓名: 尹晓东 实验目的 1. 熟悉 pentium 微处理器指令系统和寻址方式 2. 掌握汇编语言程序的编程与调试方法 实验内容 1. 结合作业第二题熟悉 pentium 微处理器实模式下算术与逻辑运算指 令的功 能,用 debug 逐条观察各个指令执行前后的相关寄存器的标志 位的变化。 2. masm6.11 的使用和汇编语言程序的调试 1) 下列程序的功能是求一组十进制无符号数(2 位数)的最大值,读懂该程 序。(见附录) 2) 用 masm6.11 汇编上述程序 3) 用 debug 跟踪,调试上述程序 ◆ 用 u 命令列出反汇编程序,与源程序清单比较 ◆ 跟踪到语句 12,检查语句执行后 ds 寄存器的变化 ◆ 语句 12 执行后,发命令 d ds:0,检查显示的内容是否与程序数据段 定义的单元内容一致。 ◆ 继续跟踪程序,检查程序执行过程中 ax,dx 等寄存器的变化 4) 将程序的功能改为求最小数 5) 如果 block 单元存的数据是压缩 bcd 码,修改上述程序。 实验报告要求 1. 画出实验内容 2 中程序的框图 2. 将实验内容 2 程序的 block 单元存放的数据改为压缩 bcd 码,列出修改后 的程序清单。 3. 实验内容 3 的程序说明和程序清单
77a4d027abde47db90f494a46a536d aa doc Created on 11/3/19999:4200PM 实验数据及结果 求最大数的程序框图 初始化DS←DATA 读入数据地址和长度: SIAX? YE 存储目前最大数:DX←AX CX<HCX-2. CX=0? NO 保存最大数:BX]+DX YE 读入高位:BX+ OFFSET MAX,DL[BX 显示高位:AH2,INT21H 易示低位 退回DOS:AH+-4CH,INT2H 结束 第2页
77a4d027abde47db90f494a46a536daa.doc Created on 11/3/1999 9:42:00 PM 第 2 页 实验数据及结果 1. 求最大数的程序框图 YES YES 初始化 DS DATA 读入数据地址和长度: SI BLOCK, CX COUNT 读入第一个数据: DX BLOCK[SI],并调整 SI 和 CX 读入后一个数据: AX BLOCK[SI] DX > AX? 存储目前最大数: DX AX 保存最大数: [BX] DX 读入高位: BX OFFSET MAX, DL [BX] 显示高位: AH 2, INT 21H 显示低位 退回 DOS: AH 4CH, INT 21H 结束 NO NO CX CX-2, CX=0?
77a4d027abde47db90f494a46a536d aa doc Created on l1/3/19999:42:00PM 2.将程序中的存储数改为压缩BCD码 segment para 52h,14h,s6h,8h,34h 63h,38h,7oh,18h,69 S-offset block I dup(?) assume cs cseg ds data start proc ax, dat mov ds. ax offset block bx, offset max mov dl, [si] mov comp: lodsb next dl. al next mov [bx], dI print: mov bx. offset max mov dl, [bx] d. cl add dl. 30h 21h mov and dl. ofh dl. 30h 21h ah. 4ch 21h 第3页
77a4d027abde47db90f494a46a536daa.doc Created on 11/3/1999 9:42:00 PM 第 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
bde47db90f494a46a536daa. doc Created on l1/3/1999 start 3.计算二位无符号数的平方 segment 数据段 string db Input a number $ Odh, Oah, Error! Please input two digit! Odh, Oah,'S Odh, Oah, The square is $ end *水**客水客客水*水*水*水**客客水客水客水*客水称*容水**水客水客水客水客 code segment 代码段 assume cs code. ds data mal push ds 数据段寄存器初始化 ax. ax data mov ah. 09h 显示 Input a number 21h moy ah. olh 输入高位 21h a.30h aL. 0 error 高位乘10 bl. al mov ah. olh 输入低位 21h a.30h aL. 0 Jg 转化为十六进制数 求平方 call hex de 十进制显示 lt 第4页
77a4d027abde47db90f494a46a536daa.doc Created on 11/3/1999 9:42:00 PM 第 4 页 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
77a4d027abde47db90f494a46a536d aa doc Created on l1/3/19999:42:00PM eror: mov dx, offset errstr;输入非0-9的字符,显示Eror noy ah. 09h 21h main enap hex dec proc ;将BX中的十六进制数以十进制显示 dx offset rest ah. 09h 21h 0 SI用于做标记,以避免显示高位的零 mov l000d 千位 mov 百位 cx. 10d call dec div 十位 ld call dec di 个位 cmp 输入的数为零,防止无显示 dl. 30h hex dec endp dec div proc dx. ax diy cx 余数存入bx cmp 0 检查标志si决定是否显示 aL. 0 出现非零数,si置1 mov ah. o2h exit: ret dec div endp 第5页
77a4d027abde47db90f494a46a536daa.doc Created on 11/3/1999 9:42:00 PM 第 5 页 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 ;----------------------------------------------------------------------
bde47db90f494a46a536daa. doc Created on l1/3/1999 code ends *涂水水客水客水客客水*水*水**涂*容客*客水客水*客水称水亦水*水客水水客*凇客事 start 第6页
77a4d027abde47db90f494a46a536daa.doc Created on 11/3/1999 9:42:00 PM 第 6 页 code ends ;************************************************************* end start