- [kanwangxue] 感觉楼主很乖的。有点孩子气。呵呵。 01/27 08:58
- [kanwangxue] it界,进去干嘛啊,到时候自己牛比了,首先写一个自己的语言,自己用。进入IT界不就是随波做流吗/?他 01/27 08:57
- [kanwangxue] 哥们,不要为了赚钱而学计算机。 计算机是年轻时候干的, 30岁后可以开始想赚钱,年轻嘛,不要这么悲 01/27 08:50
- [游客] 怎么说? 01/26 16:22
- [游客] 你这不行啊,差远了! 01/10 22:29
- [chinatree] 谢谢你。相信你也会成功的。 01/09 14:22
- [landyking] 哥们儿,好久不见。相信你会成功的。 12/02 23:34
- [chinatree] 哇哇,被挖坟了。莫生气,只是感觉谦虚些好,就算你的程序真的是史上最强的,也别说出来嘛,自己偷着乐就行 11/20 00:41
- [xiaoyao2012] 你的程序和我的程序比较也不见得你的程序又节约空间,在某种意义上说你的程序用了没学的指令,所以不见得你 11/19 15:39
- [heliang6291] 一起加油啊 07/02 02:45
- [游客] 急需一个汇编程序大作业。。。。。。。。。。。。。。。。。。。??? 12/28 16:50
- [游客] 这么多人喜欢你,我嫉妒了。但你不可以喜欢那么多,允许你在我不需要你的时候帮别人。如果我需要立叫立到。 11/13 13:11
- [tily] 兄弟 我来看你啦 呵呵 最近可好呀 09/26 22:17
- [stqcw] 能加我qq吗?1270911891 我在做课程设计2的时候 遇到点问题 09/24 09:16
- [stqcw] 能加我qq吗?1270911891 我的环境还是有点问题。按下A的时候不能显示满屏的A 09/20 09:36
- [stqcw] 牛人 我在xp里面运行王爽 汇编第二版 p280的例子 按下esc键没反应 呀 怎样在虚拟机里配置一 09/17 15:18
- [landyking] 呵呵,交个朋友,共同学习. 09/08 00:03
- [luyingdzx] 能知道你的QQ吗?或者请加一下我的QQ271190440,可以吗 虽然在论坛能获得解答,但是有的问 08/07 21:32
[2011-09-06 10:57] 第17章实验的验证
在虚拟机中,写了两个程序,一个把数据段定义的512字节的字符串写入软盘,另一个从软盘把它们读出到屏幕:
stack segment
db 32 dup (0)
stack ends
data segment
db 64 dup ('a',2,'b',2,'c',2,'d',2);64*8=512 bytes
data ends
code segment
assume cs:code,ds:code,ss:stack
start:mov ax,stack
mov ss,ax
push cs
pop ds
xor ax,ax
mov es,ax
mov di,200h
mov si,offset int7c
mov cx,offset intend-offset int7c
cld
rep movsb
mov word ptr es:[7ch*4],200h;设置入口地址
mov word ptr es:[7ch*4+2],0
mov ax,data
mov es,ax
xor bx,bx ;es:bx指向要存的内存区
mov ah,1 ;是写
mov dx,1234 ;逻辑扇区号
int 7ch
mov ax,4c00h
int 21h
int7c:push cx
push ax
mov ax,dx
xor dx,dx
mov cx,1440 ;看下是0面还是1面
div cx
push ax ;商后面用
mov ax,dx
mov cl,18 ;余数除以18得到磁道号
div cl
inc ah
mov cl,ah ;余数+1是扇区
mov ch,al ;商是磁道
pop ax
mov dh,al ;这里是面号,因为只有0,1两种状态
xor dl,dl ;操作的是a盘
pop ax
add ah,2 ;int 13h的功能号是2是读,3是写,所以要加2
mov al,1 ;要操作的扇区数
int 13h
pop cx
iret
intend:nop
code ends
end start ;这个是写进去
stack segment
db 32 dup (0)
stack ends
code segment
assume cs:code,ds:code,ss:stack
start:mov ax,stack
mov ss,ax
push cs
pop ds
xor ax,ax
mov es,ax
mov di,200h
mov si,offset int7c
mov cx,offset intend-offset int7c
cld
rep movsb
mov word ptr es:[7ch*4],200h;设置入口地址
mov word ptr es:[7ch*4+2],0
mov ax,0b800h ;写到屏幕
mov es,ax
xor bx,bx ;es:bx指向要存的内存区
mov ah,0 ;是读
mov dx,1234 ;逻辑扇区号
int 7ch
mov ax,700h ;暂停一下
int 21h
mov ax,4c00h
int 21h
int7c:push cx
push ax
mov ax,dx
xor dx,dx
mov cx,1440 ;看下是0面还是1面
div cx
push ax ;商后面用
mov ax,dx
mov cl,18 ;余数除以18得到磁道号
div cl
inc ah
mov cl,ah ;余数+1是扇区
mov ch,al ;商是磁道
pop ax
mov dh,al ;这里是面号,因为只有0,1两种状态
xor dl,dl ;操作的是a盘
pop ax
add ah,2 ;int 13h的功能号是2是读,3是写,所以要加2
mov al,1 ;要操作的扇区数
int 13h
pop cx
iret
intend:nop
code ends
end start
结果还是看图吧,事实证明,确实写进虚拟软盘了。
stack segment
db 32 dup (0)
stack ends
data segment
db 64 dup ('a',2,'b',2,'c',2,'d',2);64*8=512 bytes
data ends
code segment
assume cs:code,ds:code,ss:stack
start:mov ax,stack
mov ss,ax
push cs
pop ds
xor ax,ax
mov es,ax
mov di,200h
mov si,offset int7c
mov cx,offset intend-offset int7c
cld
rep movsb
mov word ptr es:[7ch*4],200h;设置入口地址
mov word ptr es:[7ch*4+2],0
mov ax,data
mov es,ax
xor bx,bx ;es:bx指向要存的内存区
mov ah,1 ;是写
mov dx,1234 ;逻辑扇区号
int 7ch
mov ax,4c00h
int 21h
int7c:push cx
push ax
mov ax,dx
xor dx,dx
mov cx,1440 ;看下是0面还是1面
div cx
push ax ;商后面用
mov ax,dx
mov cl,18 ;余数除以18得到磁道号
div cl
inc ah
mov cl,ah ;余数+1是扇区
mov ch,al ;商是磁道
pop ax
mov dh,al ;这里是面号,因为只有0,1两种状态
xor dl,dl ;操作的是a盘
pop ax
add ah,2 ;int 13h的功能号是2是读,3是写,所以要加2
mov al,1 ;要操作的扇区数
int 13h
pop cx
iret
intend:nop
code ends
end start ;这个是写进去
stack segment
db 32 dup (0)
stack ends
code segment
assume cs:code,ds:code,ss:stack
start:mov ax,stack
mov ss,ax
push cs
pop ds
xor ax,ax
mov es,ax
mov di,200h
mov si,offset int7c
mov cx,offset intend-offset int7c
cld
rep movsb
mov word ptr es:[7ch*4],200h;设置入口地址
mov word ptr es:[7ch*4+2],0
mov ax,0b800h ;写到屏幕
mov es,ax
xor bx,bx ;es:bx指向要存的内存区
mov ah,0 ;是读
mov dx,1234 ;逻辑扇区号
int 7ch
mov ax,700h ;暂停一下
int 21h
mov ax,4c00h
int 21h
int7c:push cx
push ax
mov ax,dx
xor dx,dx
mov cx,1440 ;看下是0面还是1面
div cx
push ax ;商后面用
mov ax,dx
mov cl,18 ;余数除以18得到磁道号
div cl
inc ah
mov cl,ah ;余数+1是扇区
mov ch,al ;商是磁道
pop ax
mov dh,al ;这里是面号,因为只有0,1两种状态
xor dl,dl ;操作的是a盘
pop ax
add ah,2 ;int 13h的功能号是2是读,3是写,所以要加2
mov al,1 ;要操作的扇区数
int 13h
pop cx
iret
intend:nop
code ends
end start
结果还是看图吧,事实证明,确实写进虚拟软盘了。
评论次数(5) |
浏览次数(454) |
类型(汇编作业) |
收藏此文 |
[ rotapple 发表于 2011-09-06 11:16 ]
老师不是让把扇区编号写成子程序吗。
[ chinatree 发表于 2011-09-06 11:30 ]
我把它写在7ch中断里了。
[ chinatree 发表于 2011-09-06 12:01 ]
安装一个新的int 7ch中断例程,实现通过逻辑扇区号对软盘进行读写。
这是书上原话,并没有说写成子程序。
[ rotapple 发表于 2011-09-06 14:00 ]
我知道的,我是说一个计算的子程序:
根据逻辑扇区号算出物理编号的这个子程序,后面写课程设计2会方便些。
[ chinatree 发表于 2011-09-06 17:28 ]
嗯好的。