东南大学微机实验报告(二)

时间:2024.3.31

         

东南大学

《微机实验及课程设计》

实验报告

        实验二、汇编语言程序设计

    名:             号:      

    业:          

评定成绩:                    审阅教师:                  

实验目的:

进一步熟悉汇编语言的编辑、宏汇编、链接和运行的基本概念

熟练掌握动态调试程序TD/DEBUG的常用指令和窗口功能,学会用TD/DEBUG调试程序,修改数据和寄存器环境

熟悉掌握汇编语言程序的典型数据结构设计、典型程序控制方法,了解DOS/BIOS功能调用的基本方法

实验内容

基本操作内容:

(1)、掌握进入全屏命令行方式、修改环境的方法启动开始菜单里的运行选项,键入cmd,即可启动命令行方式,在其属性栏中选择全屏即可进入全屏命令行方式。

(2)、确定源程序的存放目录,构建个人实验环境。

(3)、建立、编辑汇编源程序

选择程序样本,构建典型的汇编程序框架,包括基本的数据段、堆栈段和代码段,编写程序实现如下功能:

必做:

2-1.从键盘输入任意字符串后,存入自定义存储单元,判断处理后将字符串中小写字母转换为大写字母(其它字符不变),并按原顺序将这些字符在屏幕上显示出来(参考程序P36),并显示字符串“The  total number is XXXXX”。

2-2.从键盘输入一个0~255之间的十进制数,将其转换为16进制数,并在屏幕上显示变换前后的数据(参考程序P38) 。

选作:

2-3、从键盘输入5个十六进制带符号数(范围为-128~+127),请将它们按从大到小排序,并将排序前后的数据显示在屏幕上。

(4)、用汇编工具(MASM/TASM.EXE)汇编源程序产生OBJ目标文件,将所要变异的源程序文件(文件名.asm)放到带汇编工具的文件夹中,在全屏命令行模式下,进入该文件夹,输入tasm 文件名.asm,回车后即可编译产生OBJ目标文件。

(5)、用链接程序(LINK/TLINK.EXE)产生EXE可执行文件,产生OBJ目标文件后,继续输入:tlink 文件名.obj,回车后即可产生EXE可执行文件。

(6)、用调试工具软件(TD.EXE/Debug.com)调试执行程序

1在Windows中启动TD

a、  仅启动TD而不载入要调试的程序

双击TD.EXE文件名,Windows就会打开一个DOS窗口并启动TD。启动TD后会显示一个版权对话框,这时按回车键即可关掉该对话框。

b、  启动TD并同时载入要调试的程序

把要调试的可执行文件拖到TD.EXE文件名上,Windows就会打开一个DOS窗口并启动TD,然后TD会把该可执行文件自动载入内存供用户调试。若建立可执行文件时未生成符号名表,TD启动后会显示“Program has no symbol table”的提示窗口,这是按回车键即可关掉该窗口。

2观察CPU寄存器、存储器环境

TD启动后呈现的是一个具有窗口形式的用户界面,称为CPU窗口。

3单步、断点运行,观察中间结果,完成正常执行。

TD功能键F7为跟踪进入(对CALL指令将跟踪进入子程序),F8为单步跟踪(对CALL指令将执行完子程序返回后才停下),F2为在当前光标处设置、清除断点。通过单步、断点运行中观察数据区、各个寄存器值的变化,以验证程序运行是否正确。

4修改当前运行环境,直接编写程序片段,验证指令功能。

a、  修改寄存器(AX、BX、CX、DX、SI、DI、BP、SP),并观察修改段寄存器。

b、  修改存储器,并指定不同存储段。

c、  修改 CS:IP,单步运行制定指令(F7或F8),观察指令运行结果。

d、  将光标放置在TD窗口的代码区右击,可显示代码区的局部菜单,选择相应功能进行操作。

5重点解决段存储结构和数据变量的定义和访问。

访问数据段中具体位置的值时,可将光标放置在数据区,右击产生数据区菜单。

实验原理:

   

实验源程序(主要部分)和流程图:

2-1

data segment

input db 100,100 dup(0)

string1 db 0dh,0ah,'please input your strings',0dh,0ah,'$'

string2 db 0dh,0ah,'the strings you input are:',0dh,0ah,'$'

string3 db 0dh,0ah,'do you want to continue(y/n):',0dh,0ah,'$'

string4 db 0dh,0ah,'the total numer is:',0dh,0ah,'$'

number db 00h

data ends

stacks segment stack

       db 256 dup(0)

stacks ends

code segment

     assume cs:code,ds:data,ss:stacks

main proc far

start:mov ax,data

      mov ds,ax

loop1:mov dx,offset string1

      mov ah,09h

      int 21h

      mov dx,offset input

      mov ah,0ah

      int 21h

      mov dx,offset string2

      mov ah,09h

      int 21h

      mov al,input[1]

      mov number,al

      call disp

      mov dx,offset string4

      mov ah,09h

      int 21h

      call show

      mov dx,offset string3

      mov ah,09h

      int 21h

      mov ah,01h

      int 21h

      cmp al,'y'

      jz loop1

      mov ah,4ch

      int 21h

main endp

disp proc near

     xor cx,cx

     mov cl,input[1]

     mov si,2

again:mov dl,input[si]

      cmp dl,61h

      jb next

      cmp dl,7ah

      ja next

      sub dl,20h

next:mov ah,02h

     int 21h

     inc si

     loop again

     ret

disp endp

show proc near

     mov al,number

     mov ah,0h

     mov cl,0ah

     div cl

     add al,30h

     add ah,30h

     mov ch,ah

     mov dl,al

     mov ah,02h

     int 21h

     mov dl,ch

     mov ah,02h

     int 21h

     ret

show endp

     code ends

end start

2-2:

data segment

right db 1

input db 4,5 dup(0)

output db 00h

ten db 0ah

string1 db 0dh,0ah,'please input your number(0~255)',0dh,0ah,'$'

string2 db 0dh,0ah,'the number you input is(00h~ffh):',0dh,0ah,'$'

string3 db 0dh,0ah,'do you want to continue(y/n):',0dh,0ah,'$'

string4 db 0dh,0ah,'the number you input is not from 0~255',0dh,0ah,'$'

string5 db 0dh,0ah,'the number you input is(0~255):',0dh,0ah,'$'

data ends

stacks segment stack

       db 256 dup(0)

stacks ends

code segment

     assume cs:code,ds:data,ss:stacks

main proc far

start:mov ax,data

      mov ds,ax

      mov ax,stacks

      mov ss,ax

loop1:mov output,00h

      mov dx,offset string1

      mov ah,09h

      int 21h

      mov dx,offset input

      mov ah,0ah

      int 21h

      mov right,1

      mov dx,offset string5

      mov ah,09h

      int 21h

      call showin

      call change

      cmp right,0

      jz error

      mov dx,offset string2

      mov ah,09h

      int 21h

      mov ah,output

      mov dl,ah

      mov cl,4

      shr dl,cl

      call disp

      mov dl,ah

      and dl,0fh

      call disp

      mov dl,48h

      mov ah,02h

      int 21h

      jmp go

error:mov dx,offset string4

      mov ah,09h

      int 21h

go:   mov dx,offset string3

      mov ah,09h

      int 21h

      mov ah,1

      int 21h

      cmp al,'y'

      jz loop1

      cmp al,'Y'

      jz loop1

      mov ah,4ch

      int 21h

main endp

change proc near

     clc

     xor ax,ax

     xor bx,bx

     xor dx,dx

     mov cl,input[1]

     mov si,2

again:mov bl,input[si]

     cmp bl,30h

     jb error1

     cmp bl,39h

     ja error1

     sub bl,30h

     dec cl

     cmp cl,0

     jz over

     mov ax,1

     push cx

loop2:mul ten

     loop loop2

     pop cx

     mul bx

     add output,al

     jc error

     inc si

     jmp again

over:add output,bl

     jnc over1

error1:mov right,0

over1:ret

change endp

disp proc near

     push dx

     push ax

     cmp dl,9

     jbe num

     add dl,7

num:add dl,30h

     mov ah,02h

     int 21h

     pop ax

     pop dx

     ret

disp endp

showin proc near

     clc

     xor ax,ax

     xor bx,bx

     xor dx,dx

     mov cl,input[1]

     mov si,2

again1:mov dl,input[si]

     cmp dl,30h

     jb error2

     cmp dl,39h

     ja error2

     mov ah,02h

     int 21h

     inc si

     dec cl

     cmp cl,0

     jnz again1

     jmp over2

error2:mov right,0

over2:ret

showin endp

     code ends

end start

2-3:

data segment

input1 db 4,5 dup(0)

input2 db 4,5 dup(0)

input3 db 4,5 dup(0)

input4 db 4,5 dup(0)

input5 db 4,5 dup(0)

temp   db 00h,00h

tempout db 00h

output db 00h,00h,00h,00h,00h

string1 db 0dh,0ah,'please input your number(00h~ffh):',0dh,0ah,'$'

string2 db 0dh,0ah,'the number you input is(00h~ffh):',0dh,0ah,'$'

string3 db 0dh,0ah,'the number after ordering is(00h~ffh):',0dh,0ah,'$'

string4 db 0dh,0ah,'do you want to continue(y/n):',0dh,0ah,'$'

data ends

stacks segment stack

       db 256 dup(0)

stacks ends

code segment

     assume cs:code,ds:data,ss:stacks

main proc far

start:mov ax,data

      mov ds,ax

      mov ax,stacks

      mov ss,ax

loop:mov dx,offset string1

      mov ah,09h

      int 21h

      mov dx,offset input1

      mov ah,0ah

      int 21h

      mov dx,offset string1

      mov ah,09h

      int 21h

      mov dx,offset input2

      mov ah,0ah

      int 21h

      mov dx,offset string1

      mov ah,09h

      int 21h

      mov dx,offset input3

      mov ah,0ah

      int 21h

      mov dx,offset string1

      mov ah,09h

      int 21h

      mov dx,offset input4

      mov ah,0ah

      int 21h

      mov dx,offset string1

      mov ah,09h

      int 21h

      mov dx,offset input5

      mov ah,0ah

      int 21h

      call showin

      mov al,input1[2]

      mov temp[0],al

      mov al,input1[3]

      mov temp[1],al

      call change

      mov al,tempout

      mov output[0],al

  

      mov al,input2[2]

      mov temp[0],al

      mov al,input2[3]

      mov temp[1],al

      call change

      mov al,tempout

      mov output[1],al

      mov al,input3[2]

      mov temp[0],al

      mov al,input3[3]

      mov temp[1],al

      call change

      mov al,tempout

      mov output[2],al

   

      mov al,input4[2]

      mov temp[0],al

      mov al,input4[3]

      mov temp[1],al

      call change

      mov al,tempout

      mov output[3],al

      jmp loop2

loop1:jmp loop           ;77

loop2:mov al,input5[2]

      mov temp[0],al

      mov al,input5[3]

      mov temp[1],al

      call change

      mov al,tempout

      mov output[4],al

      call order;85

      mov dx,offset string3

      mov ah,09h

      int 21h

      mov si,0

circle:mov ah,output[si]

      mov dl,ah

      mov cl,4

      shr dl,cl

      call disp

      mov dl,ah

      and dl,0fh

      call disp

      mov dl,48h

      mov ah,02h

      int 21h

      mov dl,0h

      mov ah,02h

      int 21h

      inc si

      cmp si,5

      jnz circle

      mov dx,offset string4

      mov ah,09h

      int 21h

      mov ah,1

      int 21h

      cmp al,'y'

      jz loop1              ;110

      cmp al,'Y'

      jz loop1              ;112

      mov ah,4ch

      int 21h

main endp

showin proc near

      mov dx,offset string2

      mov ah,09h

      int 21h

        mov si,2

circle1:mov dl,input1[si]

        mov ah,02h

        int 21h

        inc si

        cmp si,5

        jnz circle1

        mov dl,0h

        mov ah,02h

        int 21h

        mov si,2

circle2:mov dl,input2[si]

        mov ah,02h

        int 21h

        inc si

        cmp si,5

        jnz circle2

        mov dl,0h

        mov ah,02h

        int 21h

        mov si,2

circle3:mov dl,input3[si]

        mov ah,02h

        int 21h

        inc si

        cmp si,5

        jnz circle3

        mov dl,0h

        mov ah,02h

        int 21h

        mov si,2

circle4:mov dl,input4[si]

        mov ah,02h

        int 21h

        inc si

        cmp si,5

        jnz circle4

        mov dl,0h

        mov ah,02h

        int 21h

        mov si,2

circle5:mov dl,input5[si]

        mov ah,02h

        int 21h

        inc si

        cmp si,5

        jnz circle5

        ret

showin endp

change proc near

     xor ax,ax

     xor bx,bx

     xor dx,dx

     mov bl,temp[0]

     cmp bl,40h

     jb  next1

     sub bl,37h

     jmp next

next1:sub bl,30h

next:mov temp[0],bl

     mov bl,temp[1]

     cmp bl,40h

     jb  next2

     sub bl,37h

     jmp next3

next2:sub bl,30h

next3:mov al,temp[0]

      mov cl,10h

      mul cl

      add al,bl

      mov tempout,al   

      ret

change endp

order proc near

     XOR AL,AL

     XOR BL,BL

     mov si,0h

     mov di,1h

order1:mov al,output[si]

order2:cmp al,output[di]

     jnl net

     mov bl,output[di]

     mov output[si],bl

     mov output[di],al

     mov al,output[si]

net: inc di

     cmp di,5

     jnz order2

     inc si

     mov di,si

     inc di

     cmp si,4

     jnz order1

     ret

order endp

    

disp proc near

     push dx

     push ax

     cmp dl,9

     jbe num

     add dl,7

num:add dl,30h

     mov ah,02h

     int 21h

     pop ax

     pop dx

     ret

disp endp

    code ends

end start

实验结果以及遇到的问题和解决办法:

1.得出结果为:

2。输出结果为:

3.输出结果为:

      

    

更多相关推荐:
微机实验报告

微机实验报告实验名称KeilC的使用与汇编语言上机操作一任务要求实验目的熟悉KeilC环境通过在KeilC环境下调试字节拆分合并程序数据块清零程序加法程序掌握汇编语言程序的调试方法加深对BCD码ASCII码堆栈...

微机实验报告

微机原理与接口技术实验报告姓名张楠乔学号10213030班级自动化1004指导教师周永华实验一交通灯控制实验一实验目的通过并行接口8255实现十字路口交通灯的模拟控制进一步掌握对并行口的使用二实验内容实验内容如...

微机实验报告~最新

实验一DEBUG的启动及其基本命令的使用一实验目的掌握DEBUG的基本命令及其功能二实验操作步骤6设堆栈指针SP20xxHAX3000HBX5000H请仿照例程的格式编一程序段将AX和BX的内容进行交换请用堆栈...

微机实验报告

实验一汇编语言上机操作训练比较字符串一实验目的1学习程序设计的基本方法和技能2熟练掌握汇编语言设计编写调试和运行二实验内容和要求1汇编语言程序上机操作方法编写一程序比较两个字符串STRING1和STRING2所...

微机原理实验报告

微机原理与应用课程实验报告实验分工报告人同组人实验时间20xx1210课程设计一题目要求1在数据段首址为0100H开始的内存区1按从大到小的顺序顺次存入二进制数150共16个字节的数据2将上述源区内容传送到目的...

微机原理实验报告

微机原理实验报告实验一两个多位十进制数相加的实验一实验目的学习数据传送和算术运算指令的用法熟悉在PC机上建立汇编链接调试和运行汇编语言程序的过程二实验内容将两个多位十进制数相加要求被加数和加数均以ASCII码形...

工业用微型计算机实验报告

工业用微型计算机实验报告地市郑州市准考证号01221400426姓名孟志威学科专业机械制造与自动化指导教师课题名称工业用微型计算机河南省高等教育自学考试20xx年4月20日1实验一8255动态LED数码显示实验...

电子科技大学微机实验报告(含思考题)河畔下的哈】实验6

实验六基于ARM的键盘及数码管驱动实验1掌握键盘及数码管驱动原理2掌握ZLG7290芯片的使用方法3掌握I2C总线的协议标准4掌握Linux下键盘驱动的实现方法编写测试程序控制键盘和数码管1了解ARM9处理器结...

微机原理及应用实验报告

微机原理及应用实验报告班级姓名学号中南大学机电工程学院精密测控实验室实验二软件程序设计1实验目的1掌握MCS51单片机指令系统及用汇编语言编程技巧2了解和熟悉用MCS51单片机仿真开发机调试程序的方法2实验内容...

华工微机实验报告

微机系统与接口实验电子与信息学院电类联合班何俊实验二将ASCII码表示的十进制数转换为二进制数1将ASCII码表示的十进制数转换为二进制数DATASEGMENTORG3500HNUM1DB5DUP0ORG351...

微机实验报告

微机原理与与接口技术实验报告学院应用物理与材料学院专业电子信息技术光电工程班级学号11060439学生姓名庞建富实验日期指导老师成绩评定五邑大学计算机学院制表1实验一一实验名称系统认识实验二实验目的1掌握TD系...

微机实验报告5

微机原理与应用实验报告实验序号实验5实验项目名称用DEBUG验证并熟悉8086指令系统1234567

微机实验报告(32篇)