百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分析 > 正文

《汇编语言 第三版》实验17 - 编写包含多个功能子程序的中断例程

liebian365 2024-11-27 17:07 2 浏览 0 评论

?《汇编语言 第三版》实验17 - 编写包含多个功能子程序的中断例程

by bingshuizhilian

2020年2月26日

0x0 写在前面

  • 本实验需要在虚拟机中安装msdos并且使用虚拟软盘才能完成实践,可参考笔者另一篇文章《汇编语言》实验环境搭建来搭建实验环境
  • 书中介绍的内容以3.5英寸软盘为例,虽然这种存储介质已经过时了,但是原理是通用的,稍加改动就能应用到U盘或硬盘上

0x1 必知必会

  • 3.5英寸软盘
  • 3.5英寸软盘拥有上下两面,每面有80个磁道,每个磁道分为18个扇区,每个扇区的大小为512个字节
  • 对位于不同的磁道、面上的所有扇区进行统一编号,编号从0开始,一直到2879,称这个编号为逻辑扇区编号
  • 面号和磁道号从零开始编号,扇区号从1开始编号
  • 逻辑扇区号(LBA寻址方式)转为物理编号(CHS寻址方式)的方法 用描述性运算符int()表示取商,rem()表示取余数,则:
  • 逻辑扇区号 = (面号 * 80 + 磁道号) * 18 + 扇区号 - 1
  • 面号 = int(逻辑扇区号 / 1440)
  • 磁道号 = int(rem(逻辑扇区号 / 1440) / 18)
  • 扇区号 = rem(rem(逻辑扇区号 / 1440) / 18) + 1
  • BIOS提供的访问磁盘的中断例程int 13h常用的读写功能参数
    入口参数:
      -> (ah)=int i3h的功能号(2表示读扇区、3表示写扇区)
      -> (al)=读取/写入的扇区数
      -> (ch)=磁道号
      -> (cl)=扇区号
      -> (dh)=磁头号(对于软盘即面号,因为一个面用一个磁头来读写)
      -> (dl)=驱动器号(软驱从0开始,0:软驱A,1:软驱B;硬盘从80h开始,80h:硬盘C,81h:硬盘D) 
      -> es:bx在读时指向接收从扇区读入数据的内存区,在写时指向将写入磁盘的数据的内存区
    返回参数:
      -> 操作成功:(ah)=0,(al)=读取/写入的扇区数
      -> 操作失败:(ah)=错误码

0x2 源代码

所有源码均可在笔者的github仓库中(github.com/bingshuizhilian/assembly)查看并下载。

安装程序

安装程序源代码

assume cs:code, ss:stack
stack segment
db 128 dup (0)
stack ends

code segment
start:
mov ax, stack
mov ss, ax
mov sp, 128
push cs
pop ds
mov si, offset floppydiskrw
mov ax, 0
mov es, ax
mov di, 200h

; 安装中断程序
mov cx, offset floppydiskrwend - offset floppydiskrw
cld
rep movsb

; 设置中断向量
cli
mov word ptr es:[7ch*4], 200h
mov word ptr es:[7ch*4+2], 0
sti

; 主程序退出
mov ax, 4c00h
int 21h

; 名称:floppydiskrw
; 功能:7ch号中断处理程序,实现通过逻辑扇区号对软盘进行读写
; 参数:(1)用ah寄存器传递功能号:0表示读,1表示写
;           (2)用dx寄存器传递要读写的扇区的逻辑扇区号
;           (3)用es:bx指向存储读出数据或写入数据的内存区
; 返回:无
floppydiskrw:
cmp ah, 1
ja exit
push ax
push bx
push dx
push bp
mov bp, sp
; 计算:(逻辑扇区号 / 1440); 计算结果:(ax)=int(逻辑扇区号 / 1440),(dx)=rem(逻辑扇区号 / 1440)
mov ax, dx
xor dx, dx
mov bx, 1440
div bx
push ax         ; [bp-2]: int(逻辑扇区号 / 1440)
; 计算:rem(逻辑扇区号 / 1440) / 18; 计算结果:(ax)=int(rem(逻辑扇区号 / 1440) / 18),(dx)=rem(rem(逻辑扇区号 / 1440) / 18)
mov ax, dx
xor dx, dx
mov bx, 18
div bx

; int 13h参数填写
mov ch, al      ; ->磁道号(从0开始编号)
mov cl, dl      ; ->扇区号(从1开始编号)
inc cl
mov dh, [bp-2]   ; ->磁头号,即面号(从0开始编号)
mov dl, 0            ; 驱动器号(软驱从0开始,0:软驱A)
mov ah, [bp+7]  ; 功能号(int 13h的ah参数中:2为读取,3为写入,而本中断例程中0为读取,1为写入,故加2即可)
add ah, 2
mov al, 1       ; 读取/写入的扇区数
int 13h

pop ax
pop bp
pop dx
pop bx
pop ax
exit:
iret

floppydiskrwend:
nop

code ends
end start

安装程序要点分析

  • 安装程序,顾名思义是安装一个新的中断程序,中断号是0x7c,安装位置是内存中0:200处,关于安装新的中断例程的方法可参考 公众号主界面->技术->汇编->《汇编语言第三版》实验12-编写0号中断的处理程序
  • 用逻辑扇区号计算物理编号的核心算法是两个除法,第一个除法算出面号并入栈,因为面号一定为0或1,所以新入栈的内容的低字节就是面号,所以后面的 mov dh,[bp-2]代码就是将面号送入dh寄存器;第二个除法计算磁道号和扇区号并分别送入ch、cl寄存器;功能号是通过 mov ah,[bp+7]来获取的,因为程序入口参数使用ah寄存器传递功能号,而ax寄存器在程序开始处首先入栈了,观察ax和bp的入栈顺序可计算ax的内容可通过 ss:[bp+6]来获取,且可通过 ss:[bp+7]单独获取ah的值

应用程序

应用程序源代码

assume cs:code, ds:data, ss:stack
data segment
db 'This is a int 13h floppy disk read/write testcase, 20200217@harbin', 0
data ends

stack segment
db 128 dup (0)
stack ends

code segment
start:
mov ax, stack
mov ss, ax
mov sp, 128
mov ax, data
mov ds, ax

; 调用的int 7ch的参数说明
; 功能:7ch号中断处理程序,实现通过逻辑扇区号对软盘进行读写
; 参数:(1)用ah寄存器传递功能号:0表示读,1表示写;
(2)用dx寄存器传递要读写的扇区的逻辑扇区号;       (3)用es:bx指向存储读出数据或写入数据的内存区; int 7ch写入测试push dspop esxor bx, bxmov ah, 1mov dx, 1int 7chcall delay; int 7ch读取测试mov ax, 2000hmov es, axxor bx, bxmov ah, 0mov dx, 0int 7ch; 主程序退出mov ax, 4c00hint 21hdelay:push axpush dxmov dx, 20h  ; 大概3秒左右           mov ax, 0delays:sub ax, 1sbb dx, 0cmp ax, 0jne delayscmp dx, 0jne delayspop dxpop axretcode endsend start

应用程序要点分析

  • 将ex:bx指向数据段的预设字符串,调用此前安装的新的0x7c中断例程将字符串写入软盘的逻辑扇区1
  • 写入完成后延时一段时间,并把软盘的逻辑扇区0的内容读取到内存中2000:0处

0x3 验证程序运行结果

软盘内容

内存内容

运行结果说明

  • 截图中的41、42分别是笔者使用的安装程序和应用程序,输入名字代表运行它们
  • 虚拟的软盘文件中0h和200h分别是逻辑0、1扇区的起始位置,对比200h处运行前后的内容可得知成功将内存中的字符串数据写入到了虚拟的软盘文件中,因为读取或写入操作最低都是以一个扇区512字节为单位,所以也有可能会读取内存中一些无意义的数据到软盘中,可以忽略这些无意义数据
  • 内存0:1f0处是0x7c号中断的中断向量,这里起始的4个字节存储着7ch中断例程的地址,观察运行后的截图可发现此处存储内容为00020000,即cs=0h,ip=200h,正是我们安装程序的地址
  • 0:1f0的下一行即为0:200,41.exe运行后这个地址中就存储着安装程序的机器码
  • 观察运行2000:0处内容可发现软盘逻辑0扇区我们预设的32字节内容已经成功写入到内存中,此外可能与debug环境设置有关,2000:0起始处还有一些其它数据,然后才是我们读入的数据,这里也暂可忽略

0x4 总结

通过本实验,可以理解软盘等存储介质的低级io操作,实际上u盘或硬盘的低级操作均与此类似,只要改动下驱动器号即可实现,但注意实验时不要在真实系统环境中去写硬盘,以免将硬盘中的系统关键信息覆盖而引起异常甚至系统崩溃。


每篇技术文章的末尾,笔者都会分享非常短的文学性内容,可能是一句话,也可能是一首诗,和文章内容大都不相关,只为放松下神经和增加些许文艺气息。

本期分享: 投我以木桃,报之以琼瑶。

相关推荐

快递查询教程,批量查询物流,一键管理快递

作为商家,每天需要查询许许多多的快递单号,面对不同的快递公司,有没有简单一点的物流查询方法呢?小编的回答当然是有的,下面随小编一起来试试这个新技巧。需要哪些工具?安装一个快递批量查询高手快递单号怎么快...

一键自动查询所有快递的物流信息 支持圆通、韵达等多家快递

对于各位商家来说拥有一个好的快递软件,能够有效的提高自己的工作效率,在管理快递单号的时候都需要对单号进行表格整理,那怎么样能够快速的查询所有单号信息,并自动生成表格呢?1、其实方法很简单,我们不需要一...

快递查询单号查询,怎么查物流到哪了

输入单号怎么查快递到哪里去了呢?今天小编给大家分享一个新的技巧,它支持多家快递,一次能查询多个单号物流,还可对查询到的物流进行分析、筛选以及导出,下面一起来试试。需要哪些工具?安装一个快递批量查询高手...

3分钟查询物流,教你一键批量查询全部物流信息

很多朋友在问,如何在短时间内把单号的物流信息查询出来,查询完成后筛选已签收件、筛选未签收件,今天小编就分享一款物流查询神器,感兴趣的朋友接着往下看。第一步,运行【快递批量查询高手】在主界面中点击【添...

快递单号查询,一次性查询全部物流信息

现在各种快递的查询方式,各有各的好,各有各的劣,总的来说,还是有比较方便的。今天小编就给大家分享一个新的技巧,支持多家快递,一次能查询多个单号的物流,还能对查询到的物流进行分析、筛选以及导出,下面一起...

快递查询工具,批量查询多个快递快递单号的物流状态、签收时间

最近有朋友在问,怎么快速查询单号的物流信息呢?除了官网,还有没有更简单的方法呢?小编的回答当然是有的,下面一起来看看。需要哪些工具?安装一个快递批量查询高手多个京东的快递单号怎么快速查询?进入快递批量...

快递查询软件,自动识别查询快递单号查询方法

当你拥有多个快递单号的时候,该如何快速查询物流信息?比如单号没有快递公司时,又该如何自动识别再去查询呢?不知道如何操作的宝贝们,下面随小编一起来试试。需要哪些工具?安装一个快递批量查询高手快递单号若干...

教你怎样查询快递查询单号并保存物流信息

商家发货,快递揽收后,一般会直接手动复制到官网上一个个查询物流,那么久而久之,就会觉得查询变得特别繁琐,今天小编给大家分享一个新的技巧,下面一起来试试。教程之前,我们来预览一下用快递批量查询高手...

简单几步骤查询所有快递物流信息

在高峰期订单量大的时候,可能需要一双手当十双手去查询快递物流,但是由于逐一去查询,效率极低,追踪困难。那么今天小编给大家分享一个新的技巧,一次能查询多个快递单号的物流,下面一起来学习一下,希望能给大家...

物流单号查询,如何查询快递信息,按最后更新时间搜索需要的单号

最近有很多朋友在问,如何通过快递单号查询物流信息,并按最后更新时间搜索出需要的单号呢?下面随小编一起来试试吧。需要哪些工具?安装一个快递批量查询高手快递单号若干怎么快速查询?运行【快递批量查询高手】...

连续保存新单号功能解析,导入单号查询并自动识别批量查快递信息

快递查询已经成为我们日常生活中不可或缺的一部分。然而,面对海量的快递单号,如何高效、准确地查询每一个快递的物流信息,成为了许多人头疼的问题。幸运的是,随着科技的进步,一款名为“快递批量查询高手”的软件...

快递查询教程,快递单号查询,筛选更新量为1的单号

最近有很多朋友在问,怎么快速查询快递单号的物流,并筛选出更新量为1的单号呢?今天小编给大家分享一个新方法,一起来试试吧。需要哪些工具?安装一个快递批量查询高手多个快递单号怎么快速查询?运行【快递批量查...

掌握批量查询快递动态的技巧,一键查找无信息记录的两种方法解析

在快节奏的商业环境中,高效的物流查询是确保业务顺畅运行的关键。作为快递查询达人,我深知时间的宝贵,因此,今天我将向大家介绍一款强大的工具——快递批量查询高手软件。这款软件能够帮助你批量查询快递动态,一...

从复杂到简单的单号查询,一键清除单号中的符号并批量查快递信息

在繁忙的商务与日常生活中,快递查询已成为不可或缺的一环。然而,面对海量的单号,逐一查询不仅耗时费力,还容易出错。现在,有了快递批量查询高手软件,一切变得简单明了。只需一键,即可搞定单号查询,一键处理单...

物流单号查询,在哪里查询快递

如果在快递单号多的情况,你还在一个个复制粘贴到官网上手动查询,是一件非常麻烦的事情。于是乎今天小编给大家分享一个新的技巧,下面一起来试试。需要哪些工具?安装一个快递批量查询高手快递单号怎么快速查询?...

取消回复欢迎 发表评论: