学习<<汇编语言 -王爽>>,自已完成的一道实试题 (6)

实验13  编写、应用中断例程 第一小题(材料详见书上262页)

题目描述:

(1)编写并安装int 7ch中断例程,功能为显示一个用0结束的字符串,中断例程安装在0:200处。

参数:(dh)=行号,(dl)=列号,(cl)=颜色,ds:si指向字符串首地址。

以上中断例程安装成功后,对下面的程序进行单步跟踪,尤其要注意观察int、iret指令执行前后CS、IP和栈中的状态。

以下是我解答的完整的代码:

:>----------------------------------------------------------------------------------------

[t1.asm] 文件内容(用于测试中断程序)

;程序功能:测试安将好的中断类型码为7ch的中断处理程

;参数:dh-行数,dl-列数,cl-属性字节,ds-字符串的段地址,si-偏移量

assume cs:codesg, ds:datasg, ss:stacksg

datasg segment

db ‘Welcome to masm!‘,0

datasg ends

stacksg segment

dw 16 dup(0)

stacksg ends

codesg segment

start: mov ax, stacksg

mov ss, ax

mov sp, 20h

mov dh, 10

mov dl, 10

mov cl, 2

mov ax, datasg

mov ds, ax

mov si, 0

;下面将转向中断处理程序

int 7ch

mov ax, 4c00h

int 21h

codesg ends

end start

[t2.asm] 文件内容 (用来安装中断程序)

;程序功能:安装中断类型码为7ch的中断处理程序到0000:0200

;并且修改中断向量表,使产生7ch中断时跳转到中断程序的入口

assume cs:codesg

codesg segment

start: mov ax, 0

mov es, ax

mov di, 200h

mov ax, cs

mov ds, ax

mov si, offset do7c

;由masm编译器计算要复制的字节量

mov cx, offset do7cend - offset do7c

;清除DF标志,即设置DF为0(表示si、di将自增)

cld

;把由ds:si指向的地址中的数据, 逐个字节复制到由es:di指向的地址空间

;复制的数量由cx指定

rep movsb

;以下设置中断类型码为7ch的中断处理程序入口, 改为0000:0200

mov word ptr es:[7ch*4], 200h

mov es:[7ch*4+2], es

mov ax, 4c00h

int 21h

;中断类型码为7ch的中断处理程序

do7c: push es

push si

push di

push ax

push cx

push dx

;以上保存程序中使用了的寄存器

mov ax, 0B800h

mov es, ax

mov al, 160

mul dh

mov di, ax

mov al, 2

mul dl

add di, ax

;以上用di保存根据参数行、列指定在显存中的偏移量

mov dl, cl

;以上用dl暂存参数-字符的显示属性字节, 因为下面要用jcxz来跳转

mov ch, 0

s0:mov cl, ds:[si]

jcxz ok

mov es:[di], cl

mov es:[di].1, dl

inc si

add di, 2

jmp s0

;以上根据字符信息、属性字节设置对应的显存内容

ok:pop dx

pop cx

pop ax

pop di

pop si

pop es

iret

mov ax, 4c00H

int 21H

do7cend:nop

codesg ends

end start

:<----------------------------------------------------------------------------------------

总结:

中断也可以以子程序调用的形式使用就像使用call指令。编译的时候 mov es:[7ch*4+2], es 我之前写成了

mov es:[7ch*4+2], 0 发现出错了,原来是不能直接将立即数传给段寄存器,须用通用寄存器当中介。在使用Debug调试t1.exe时,执行到 int 7ch 后正常的跳向中断处理程序入口,但不知道为什么在执行到 mov ax, 0B800h 时就出现下面的弹框:

原来是测试程序t1.exe中的栈设置的有点小。

正确               错误

dw 16 dup(0) 之前为 dw 8 dup(0)

mov sp, 20h  之前为 mov sp, 10h

-------------   以上的习题部分及代码引用于王爽老师的<<汇编语言>>第二版  ----------------

时间: 2024-08-05 11:10:53

学习<<汇编语言 -王爽>>,自已完成的一道实试题 (6)的相关文章

学习&lt;&lt;汇编语言 -王爽&gt;&gt;这本书一段时间,自已完成的一道实试题 (2)

实验9 根据材料编程 (材料详见书上188页) 编程:在屏幕中间分别显示绿色.绿底红色.白底蓝色的字符串 'welcome to masm!' 材料:   80X25彩色字符模式显示缓冲区的结构: 内存地址空间中,B8000H~BFFFFH共32KB的空间,该模式下显示器可以显示25行,每行80个字符,每个字符可以有256种属性(背景色.前景色.闪烁.高亮等组合信息). 这样,一个字符在显示缓冲区中共占两个字节,分别存放字符的ASCII码和属性.80X25模式下,一屏的内容在显示缓冲区中共占40

学习&lt;&lt;汇编语言 -王爽&gt;&gt;,自已完成的一道实试题 (4)

实验10 编写子程序- 第三小题 (材料详见书上209页) 题目描述: 3.数值显示:将二进制数据用十进制显示到屏幕 子程序描述: 名称:dtoc 功能:将word型数据转变为表示十进制的字符串,字符串以0结尾. 参数:(ax)=word型数据 ds:si指向字符串的首地址 返回:无 应用举例:编程将数据12666以十进制的形式在屏幕的8行3列,用绿色显示出来. 12666 = 317AH 10 = 0AH 以下是我解答的完整的代码: :>----------------------------

汇编语言 王爽

汇编语言 王爽 目录 汇编语言... 1 王爽... 1 第一章:基础知识 第二章:寄存器 第三章 寄存器(内存访问) 第四章 第一个程序 第六章  包含多个段的程序 第七章 更灵活定位内存的方法 第八章 数据处理的两个基本问题 第一章:基础知识 汇编语言:汇编语言是什么?为什么学习汇编语言?学习汇编语言是学习什么? 早起使用机器语言,但机器语言 晦涩难懂也难以使用,所以出现了汇编语言.即用通熟易懂的汇编指令替代全是二进制0和1的机器指令. 于是也就出现了编译器,即把汇编指令翻译成机器指令. 机

汇编语言 王爽第二版 总结

汇编语言 王爽第二版 总结,所以内容都是8086的 summary asssembly ,汇编总结 why: 最初始的编程语言就是使用打孔机,打出来的0 1 代码,然后把卡片插入到电脑中运行然后 看输出结果,这种纯01的二进制代码,编写困难调试困难运行结果的显示看着也很蛋疼,就像 一个简单的"hello world",11个字符,需要11×8个二进制,并且再进行输出,就更麻烦,因为 全部都是二进制,代码.为了更高效的开发程序,就出现了汇编语言,用来代替二进制代码的输入. what: 汇

汇编语言(王爽)pdf

下载地址:网盘下载 <汇编语言(第2版)>是各种CPU提供的机器指令的助记符的集合,人们可以用汇编语言直接控制硬件系统进行工作.汇编语言是很多相关课程(如数据结构.操作系统.微机原理等)的重要基础.为了更好地引导.帮助读者学习汇编语言,作者以循序渐进的思想精心创作了<汇编语言(第2版)>.<汇编语言(第2版)>具有如下特点:采用了全新的结构对课程的内容进行组织,对知识进行最小化分割,为读者构造了循序渐进的学习线索:在深入本质的层面上对汇编语言进行讲解:对关键环节进行深入

汇编语言 王爽著

汇编语言让我们深入了解计算机底层,值得去学习了解. 汇编语言(assembly language)是一种用于电子计算机.微处理器.微控制器或其他可编程器件的低级语言,亦称为符号语言.在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地址符号(Symbol)或标号(Label)代替指令或操作数的地址.在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令.普遍地说,特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植.

汇编语言(王爽) 第1章基础知识

1.1 机器语言 机器语言就是机器指令的集合.机器指令是啥呢?就是一列二进制的数据,计算机把它转成高低电平,使计算机的其他器件驱动并运算.(计算机如何使用2进制语言?) 早期程序都是用机器语言写的,但是有个问题就是太麻烦,数据信息太长,写错一个0或1就会来BUG了. 这种机器语言根本不是人写的,注定会被淘汰. 1.2 汇编语言 这个时候,汇编语言就挺身而出. 汇编语言就是机器语言的便于记忆的格式把 一个指令1000100010001000 表示把寄存器A1的内容弄到寄存器A2上.如下 操作介绍:

汇编语言 王爽著第三章

汇编语言(assembly language)是一种用于电子计算机.微处理器.微控制器或其他可编程器件的低级语言,亦称为符号语言.在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地址符号(Symbol)或标号(Label)代替指令或操作数的地址.在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令.普遍地说,特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植.

汇编语言(王爽) 第6章包含多个段的程序

程序到了内存中我们分为code(代码)段,也就是大部分指令段,数据段,栈 6.1 在代码段中使用数据 上图 dw表示define word定义一个字,16位 会出现cs执行的前16位是数据段,后面才是指令,所以要把IP设成10h 或者直接在第一条指令前面在start,再在最后面的end start 程序运行的第一条不是汇编指令可能会报错把 6.2 在代码段中使用栈 这的题目都是从内存单元的数据换到另一个内存单元 开始奇怪,为啥不直接换,还要专门定义一个栈空间出来做个中间体 查了资料才知道,内存单