汇编语言-实验5

一、实验目的

  1. 学会汇编语言程序的编译链接执行。
  2. 学会使用debug分步调试程序。
  3. 掌握代码段定义相关伪操作。
  4. 初步学会使用loop语句实现简单循环程序设计

二、实验要求

  1. 请用绿色或者蓝色字体作答。
  2. 源程序直接粘贴文字,源程序不要截图。

三、实验过程和结果
在这里插入图片描述

  • 1.将汇编语言编译环境(masm文件夹)复制粘贴至c或者d根目录下(这个步骤在前几个实验中就已经完成)。
  • 2.将上图汇编语言程序输入至记事本中(分号后面的是注释,可以不敲入),并且另存为“文件名.asm”的形式。文件命名请以字母或者下划线开头,不要使用中文。例如“myfile.asm”。请注意输入的时候符号是全角还是半角状态。
  • 3.进入dosbox,mount命令使用完成后,进入masm文件夹。
    在这里插入图片描述
  • 4.编译链接执行汇编语言程序。从键盘输入某个字母,如下图中输入了q

在这里插入图片描述
思考1:上图中qqa是怎么回事(不一定是q,你也可以输入其他字符),请猜测这个程序干了什么事情(参阅系统功能调用int 21h)。

  • 从键盘输入单个字符后,输出与键盘输入的字符相同的字符,然后输出大写的字母A(大写字母A的ASCII码对应的十六进制是41)比如输如q,输出qqA

5.Debug生成的exe程序,并逐条执行。注意使用t和p命令。直到程序运行结束,用q命令退出debug。
在这里插入图片描述在这里插入图片描述
思考2:本程序并没有使用cx寄存器,可是cx=0015h这是随机数还是有什么含意?可再次debug逐条执行,看看cx是不是不同。

  • CX中存放的是程序的长度,程序的机器码共有15个字节,

如下图所示:
在这里插入图片描述
6.尝试修改源程序,完成你想要的功能,并另存为另外的名字(能用中文名吗)。

新源程序粘贴如下(不要截图):

code segment   
;求解2*2*2
         assume  cs:code
start:
        mov ax,2
         add ax,ax
         add ax,ax
         mov ax,4c00h
         int 21h
code ends
end start

7.重新编译链接执行新源程序,看看能不能得到你想要的结果(程序中适当的注释是不是很有用呢?)。

截图:
在这里插入图片描述

8.debug你的新程序生成的可执行文件,并逐条执行。注意查看刚刚加载时cx的值。

思考3:初始状态cx寄存器的值跟之前的程序一样吗?

  • 不一样,因为修改后的源程序的代码长度变了,CX表示程序中代码的长度

9.请自己尝试编写求2的3次方的汇编程序,运行结果保存在AX寄存器中。编译、链接、执行后,debug所生成的可执行文件,再用u命令查看代码,用t命令单步执行后查看结果(如果遇到int 21h 请用p命令执行)。填写代码段的范围。
源程序:

code segment   
;求解2*2*2
         assume  cs:code
start:
        mov ax,2
         add ax,ax
         add ax,ax
         mov ax,4c00h
         int 21h
code ends
end start

debug可执行文件,查看初始状态,截图:
在这里插入图片描述
psp起止地址:

DS的值为075A,则PSP的地址为075A:0000

代码段地址范围:

076A:0000  076A 000C

10. 编写程序,计算2的10次方,结果存放在任意通用寄存器中。你的程序可以通过修改数字10,计算2的20次方吗,为什么?

  • 不可以,试过了,好像放不下,2的20次方是1048576,转换成16进制是10 0000,然而,AX只显示4个0

源程序粘贴如下(不要截图):

code segment   
         assume  cs:code
start:
         mov ax,2
         mov cx,9
s:   add ax,ax
     loop s
         mov ax,4c00h
         int 21h
code ends
end start

debug生成的可执行文件,并且t命令单步执行程序,观察loop指令的执行过程(最后几个t截图)
在这里插入图片描述
结果:
在这里插入图片描述

11. 编写程序,计算15*69,结果存放在任意通用寄存器中。(debug的t命令是不是会敲的手抽筋?请试试g +偏移地址的形式或者p命令执行loop指令)
源程序(不要截图):

code segment   
         assume  cs:code
start:
         mov ax,0
         mov cx,69
  s:     add ax,15
         loop s

         mov ax,4c00h
         int 21h
code ends
end start

结果:AX=040B(十进制1035)
在这里插入图片描述

12.编写程序,计算2+4+6…+100,结果存放在内存中。
源程序(不要截图):

code segment   
         assume  cs:code
start:
         mov ax,0
         mov bx,0 
         mov cx,50
         mov dx,2

  s:     add ax,dx
         add dx,2
         add bx,ax 
         loop s

         mov ax,4c00h
         int 21h
code ends
end start

结果:
在这里插入图片描述
在这里插入图片描述

【好啦,老师这周就要讲解了,等老师讲完,错了的地方我就来更改,小编今天下午去吃了凉皮呢!虽然每次吃凉皮我都觉得量好少啊,可能是学校的量少吧,(但是我今天吃的是校外的啊,附近好像新开了一家什么“叉骨店”嗯,改天要去吃!)】

句子君:

“现在知道了,那些恣意飞扬的岁月里,我们每一次躁动不安的梦想,年轻气盛的誓言,猝不及防的暗恋,义无反顾地摔倒又爬起,其实都藏着一颗颗饱满的种子,它让我们有了脊椎,有了思想,有了人格,通晓了嘴巴和手真正的功能。在人生每一场来势凶猛的暗战中,保全了自己。”

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
8259是一种可编程中断控制器,它可以处理多个设备的中断请求。在计算机系统中,中断是一种非常重要的机制,可以使CPU不必等待一些外设的操作完成,从而提高了系统的效率。 8259最常见的应用是在IBM PC和兼容机中,它可以管理PC中的各种设备,如键盘、鼠标、硬盘、打印机等等。在8259中,有8个中断请求线(IRQ0-IRQ7),可以连接到不同的设备上。当设备需要CPU的处理时,会向8259发送一个中断请求信号,8259会将这个请求转发给CPU,CPU会暂停当前正在执行的程序,转而去处理中断程序。当中断程序执行完毕后,CPU会回到原来的程序继续执行。 在本实验中,我们将学习如何使用汇编语言编写8259的初始化程序,使其可以正确地处理中断请求。 首先,我们需要了解8259的一些基本概念和寄存器。 8259有两个级联的芯片,一个是主芯片(master),另一个是从芯片(slave)。主芯片的IRQ0-IRQ7可以连接到不同的设备上,而从芯片只能连接到主芯片的某一个IRQ上。当从芯片需要处理中断请求时,它会向主芯片发送一个中断请求信号,由主芯片将这个请求转发给CPU。 8259有两个重要的寄存器,一个是控制寄存器(ICW),另一个是中断屏蔽寄存器(IMR)。 控制寄存器(ICW)分为4个字节,分别是ICW1、ICW2、ICW3、ICW4。ICW1用于设置8259的工作方式,ICW2用于设置中断向量号,ICW3用于设置级联方式,ICW4用于设置一些特殊功能。在初始化8259时,需要写入这些寄存器的值,以完成8259的设置。 中断屏蔽寄存器(IMR)用于控制8259对中断请求的响应。当某个设备需要中断处理时,它会向8259发送一个中断请求信号,如果该设备所在的IRQ对应的IMR位被设置为1,则8259会忽略该请求。只有当该位被清零后,8259才会将请求转发给CPU。 下面是一个简单的8259初始化程序,可以将主芯片的IRQ0-IRQ7全部开启,并设置中断向量号为0x20-0x27。该程序的实现过程如下: 1. 关闭中断,以免在初始化过程中被其他中断打断。 2. 向8259的控制寄存器写入ICW1,设置8259的工作方式为初始化。 3. 向8259的控制寄存器写入ICW2,设置中断向量号为0x20-0x27。 4. 向8259的控制寄存器写入ICW3,设置主芯片的从芯片连接方式。 5. 向8259的控制寄存器写入ICW4,设置一些特殊功能。 6. 向8259的中断屏蔽寄存器写入初始值,使得所有中断请求都能被响应。 7. 打开中断,使得CPU能够响应中断请求。 下面是该程序的具体实现过程: ``` ; 8259初始化程序 ; 将主芯片的IRQ0-IRQ7全部打开 ; 中断向量号为0x20-0x27 section .text global init_8259 init_8259: cli ; 关闭中断 ; 初始化8259 mov al, 0x11 ; ICW1:初始化,边沿触发,级联8259 out 0x20, al mov al, 0x20 ; ICW2:中断向量号从0x20开始 out 0x21, al mov al, 0x04 ; ICW3:连接从芯片到IRQ2 out 0x21, al mov al, 0x01 ; ICW4:8086模式,正常EOI out 0x21, al ; 设置IMR,打开所有中断 mov al, 0x00 ; IMR初始化为0,使得所有中断请求都能被响应 out 0x21, al sti ; 打开中断 ret ``` 在上述程序中,我们使用了汇编语言的in/out指令向8259的寄存器中写入数据,从而完成了8259的初始化设置。 该程序的主要作用是将8259初始化为可用状态,以便处理各种设备的中断请求。在实际应用中,我们可以将该程序作为系统启动时的一部分,以保证系统能够正确地响应各种中断请求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

少年游四方

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值