《汇编语言》- 读书笔记 - 第17章-实验17 编写包含多个功能子程序的中断例程

《汇编语言》- 读书笔记 - 第17章-实验17 编写包含多个功能子程序的中断例程

  • 逻辑扇区
    • 根据逻辑扇区号算出物理编号
    • 中断例程:通过逻辑扇区号对软盘进行读写
  • 代码
    • 安装 int 7ch
  • 测试程序
  • 效果

实现通过逻辑扇区号对软盘进行读写

逻辑扇区

计算公式: 逻辑扇区号 =(面号*80+磁道号)*18+扇区号-1

let lg = (,, 扇区) => (*80+)*18+扇区-1;
lg(1,60,10); // 2529
// 创建一个空数组来存放所有的逻辑扇区号
let logicalSectors = [];
// 遍历指定范围的所有组合
for (let head = 0; head <= 1; head++) { // 面号从0到1for (let track = 0; track <= 79; track++) { // 磁道号从0到79for (let sector = 1; sector <= 18; sector++) { // 扇区号从1到18logicalSectors.push([head,track,sector]);}}
}
// 输出所有逻辑扇区号(索引就是逻辑扇区号)
console.table(logicalSectors);
扇区逻辑扇区
0010
179182879

根据逻辑扇区号算出物理编号

物理编号公式
面号取商( 逻辑扇区号 / 1440 )
磁道号取商( 取余( 逻辑扇区号 / 1440 ) / 18 )
扇区号取余( 取余( 逻辑扇区号 / 1440 ) / 18) + 1

中断例程:通过逻辑扇区号对软盘进行读写

功能通过逻辑扇区号对软盘进行读写
参数ah = 功能号:0=读,1=写;
dx = 逻辑扇区号;
es:bx=用于读写的缓冲区

代码

安装 int 7ch

assume cs:code
code segmentstart:	; ---------------- 安装(复制数据) ----------------mov ax,csmov ds,axmov si,offset i7ch		;设置 ds:si 指向源地址mov ax,0mov es,axmov di,200h				;设置 es:di 指向目的地址mov cx,offset i7chend -offset i7ch	;设置 cx为传输长度cld					;设置传输方向为正。movsb中si,di递增rep movsb			;重复复制数据次数由 cx 控制; ---------------- 安装(复制数据) ----------------; ----------------- 设置中断向量 -----------------mov ax,0mov es,ax						; 段地址 0mov word ptr es:[7ch*4],200h	; 设置【中断处理程序】的:偏移地址mov word ptr es:[7ch*4+2],0		; 设置【中断处理程序】的:段地址; ----------------- 设置中断向量 -----------------mov ax, 4c00H		; 退出int 21H				; 触发33号中断
; =======================================================
; --------------------- 中断处理程序 --------------------
; 通过逻辑扇区号对软盘进行读写
; -------------------------------------------------------
; 参数:ah = 功能号:0=读,1=;
; 参数:dx = 逻辑扇区号;
; 参数:es:bx = 用于读写的缓冲区
; -------------------------------------------------------org 200h 		; ORG 指定下面代码从一个特定地址开始编译i7ch:	push dx			; 备份寄存器cmp ah,1		; 功能号>1直接退出ja i7chokcall logical2physical	; 算出物理:面号、磁道号、扇区号mov dl,0				; 驱动器号 A盘mov al,8				; 读写扇区数cmp ah,0				je read			; 读跳 readjmp write		; 否则跳 writeread:mov ah,02hint 13hjmp i7chokwrite:mov ah,02hint 13hi7chok:	pop dx			; 还原寄存器iret 			; 返回原程序
; --------------------- 中断处理程序 --------------------
; =======================================================; =======================================================
; --------------------- 中断处理程序 --------------------
; 根据逻辑扇区号算出物理编号
; -------------------------------------------------------
; 参数:dx = 逻辑扇区号
; 返回:dh = 面号 	01
; 返回:ch = 磁道号 06
; 返回:cl = 扇区号 109
; -------------------------------------------------------
logical2physical:jmp short l2ph_starthts dw 1440, 18
l2ph_start: push ax		; 备份寄存器push bxmov ax,dxmov dx,0; 逻辑扇区号 / 1440:商ax = 面号,余数dx拿去算:磁道号、扇区号div word ptr hts[0]	; 除以 1440mov bx,ax	; 面号(临时保存); dx / 18:商al = 磁道号,余数ah + 1 = 扇区号mov ax,dxdiv byte ptr hts[2]	; 除以 18mov ch,al	; 磁道号inc ahmov cl,ah	; 扇区号mov dh,bl	; 面号pop bx		; 还原寄存器pop axret 		; 返回原程序
; --------------------- 中断处理程序 --------------------
; =======================================================i7chend:	nop
code ends
end start

测试程序

assume cs:code
data segmentarr db 4000 dup(0)
data endscode segmentstart: mov ax,datamov es,axmov bx,offset arrmov ah,0mov dx,0int 7chok:	mov ax,4c00hint 21h
code ends
end start

效果

int 13h 读写始终失败,DOSBox 和 VMware上装的 DOS7.10 都试过了。暂时没想到办法

DOSBox
在这里插入图片描述

虚拟机上DOS
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/733137.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从零开始学HCIA之IPv6基础06

1、OSPFv3是IPv6路由基础&#xff0c;OSPFv3是运行于IPv6的OSPF路由协议&#xff0c;是一个独立的路由协议。 2、OSPFv3报文类型和作用 &#xff08;1&#xff09;Hello报文&#xff0c;周期性发送&#xff0c;用来发现和维持OSPFv3邻居关系。 &#xff08;2&#xff09;DBD…

CSS基础知识

font-family: "Trebuchet MS", Verdana, sans-serif; 字体栈&#xff0c;浏览器会一个一个试过去看下哪个可以用 font-size16px; font-size1em; font-size100%;//相对于16px 字体大小&#xff0c;需要进行单位换算16px1em font-weightnormal;//400font-weight属性…

docker搭建zero-ui

确保你已经安装了Docker和Docker Compose。如果没有&#xff0c;请参照官方文档安装&#xff1a;Docker 和 Docker Compose。 使用 Docker CLI 获取 Zero-UI 镜像: 首先&#xff0c;你需要从Docker Hub获取Zero-UI的Docker镜像。你可以使用 docker pull 命令来下载它。 docker…

YoloV5改进策略:Block改进|自研Block,涨点超猛|代码详解|附结构图

涨点效果 参考模型 参考的Block,如下图: 我对Block做了修改,修改后的结构图如下: 代码详解 from timm.models.layers import DropPathfrom torch import Tensor def channel_shuffle(x: Tensor, groups:

用Java Socket手撸了一个HTTP服务器

作为一个 Java 后端&#xff0c;提供 HTTP 服务可以说是基本技能之一了&#xff0c;但是你真的了解 HTTP 协议么&#xff1f;你知道知道如何手撸一个 HTTP 服务器么&#xff1f;Tomcat 的底层是怎么支持 HTTP 服务的呢&#xff1f;大名鼎鼎的 Servlet 又是什么东西呢&#xff0…

可观测性是什么?新手入门指南!

如果您之前对可观测性重要性&#xff0c;益处&#xff0c;以及组成不甚了解&#xff0c;本文是一个合适的指南手册。 什么是可观测性&#xff1f; 可观测性被定义为根据系统产生的输出数据&#xff08;如日志&#xff0c;指标和链路追踪&#xff09;来衡量当前系统运行状态的…

Apache的安装与目录结构详细解说

1. Apache安装步骤 Apache是一款开源的Web服务器软件&#xff0c;常用于搭建网站和服务。以下是Apache的安装步骤&#xff1a; 在官方网站&#xff08;https://httpd.apache.org/&#xff09;下载最新版本的Apache软件包。解压下载的软件包到指定目录。运行安装程序&#xff…

代码理解 pseudo_labeled = outputs.max(1)[1]

import torchls torch.Tensor([[0.2,0.4],[0.3,0.2]]) print(ls.max(1))

Xss防护

Xss防护 CSP安全策略&#xff0c;类似于黑名单&#xff0c;只允许加载本地图片&#xff0c;外部链接图片无法链接防御成本极低&#xff0c;同时有很多指令&#xff0c;同源策略&#xff0c;可添加不同类型的指令实现不同的要求。&#xff08;同源策略&#xff1a;同端口&#…

C++从零开始的打怪升级之路(day47)

这是关于一个普通双非本科大一学生的C的学习记录贴 在此前&#xff0c;我学了一点点C语言还有简单的数据结构&#xff0c;如果有小伙伴想和我一起学习的&#xff0c;可以私信我交流分享学习资料 那么开启正题 今天分享的是关于set和map的知识点 1.关联式容器 在前面&#…

VUE 之 Vuex 和 Pina 介绍

Vuex 和 Pina 是两种不同的 Vue 状态管理库&#xff0c;它们在设计理念和使用方式上有一些区别。 Vuex: 官方状态管理库&#xff1a; Vuex 是 Vue.js 官方推荐的状态管理库&#xff0c;与 Vue 框架深度集成&#xff0c;提供了一种集中式存储管理应用中所有组件的状态的方式。…

STL之deque容器代码详解

1 基础概念 功能&#xff1a; 双端数组&#xff0c;可以对头端进行插入删除操作。 deque与vector区别&#xff1a; vector对于头部的插入删除效率低&#xff0c;数据量越大&#xff0c;效率越低。 deque相对而言&#xff0c;对头部的插入删除速度回比vector快。 vector访问…

Unity Shader实现UI流光效果

效果&#xff1a; shader Shader "UI/Unlit/Flowlight" {Properties{[PerRendererData] _MainTex("Sprite Texture", 2D) "white" {}_Color("Tint", Color) (1, 1, 1, 1)[MaterialToggle] PixelSnap("Pixel snap", float…

简洁的在线观影开源项目

公众号&#xff1a;【可乐前端】&#xff0c;每天3分钟学习一个优秀的开源项目&#xff0c;分享web面试与实战知识。 每天3分钟开源 hi&#xff0c;这里是每天3分钟开源&#xff0c;很高兴又跟大家见面了&#xff0c;今天介绍的开源项目简介如下&#xff1a; 仓库名&#xff1…

使用kubectl port-forward 端口转发来快速调试应用

应用场景 只要 pod 在 kubernetes 里面拉起来&#xff0c;就可以在本地终端快速调试应用&#xff0c;注意此方法只适合开发调试&#xff0c;长久使用在生产环境不推荐 使用命令 kubectl port-forward 资源名 本地端口:容器端口 转发原理 本地端口建立的连接将被转发到运行…

海外媒体发稿:7种媒体套餐推广策略解析-华煤舍

有效的媒体宣传策略对于产品或服务的推广至关重要。本文将介绍7种媒体套餐推广策略&#xff0c;帮助您惊艳市场&#xff0c;并取得成功。以下是每种策略的拆解描述&#xff1a; 1. 广告投放 广告投放是最常见的宣传手段之一。通过在各种媒体平台上购买广告&#xff0c;如电视、…

Web渗透测试流程

什么是渗透测试 渗透测试 (penetration test),是通过模拟恶意黑客的攻击方法&#xff0c;来评估计算机网络系统安全的一种评估方法。这个过程包括对系统的任何弱点、技术缺陷或漏洞的主动分析&#xff0c;这个分析是从一个攻击者可能存在的位置来进行的&#xff0c;并且从这个…

linux 查看打开使用了哪些端口

你可以使用 netstat 命令来查看Linux系统中正在使用的端口。例如&#xff0c;要查看所有正在使用的TCP和UDP端口&#xff0c;你可以运行&#xff1a; sudo netstat -tulpn如果你只想查看所有正在使用的TCP端口&#xff0c;你可以运行&#xff1a; sudo netstat -tpln 如果你只…

全网最最最详细centos7如何安装docker教程

在CentOS 7上安装Docker主要包括以下步骤&#xff1a; 1. 卸载旧版本的Docker 首先&#xff0c;需要确保系统上没有安装旧版本的Docker。可以通过以下命令来卸载它们&#xff1a; sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-late…

代码随想录day40||● 343. 整数拆分 ● 96.不同的二叉搜索树

343. 整数拆分 - 力扣&#xff08;LeetCode&#xff09; 动态规划&#xff0c;本题关键在于理解递推公式&#xff01;| LeetCode&#xff1a;343. 整数拆分_哔哩哔哩_bilibili class Solution { public:int integerBreak(int n) {vector<int> dp(n1);dp[2]1;for(int i3…