请教大家一个汇编中 中断子程序的问题

longfengxiang 2008-10-09 07:33:34

本程序功能为:当除法溢出时,产生0号中断信息,从而引发do0中断过程(子程序送入0:200H处),显示"overflow!"字符串。
assume cs:code
code segment
start: mov ax,cs
mov ds,ax
mov si,offset do0;设置ds:si指向源地址
mov ax,0
mov es,ax
mov di,200h;设置es:di指向目的地址
mov cx,offset do0end-offset do0;设置cx传输长度
cld;设置传输方向为正
rep movsb
mov ax,0;设置中断向量表
mov es,ax
mov word ptr es:[0*4],200h;为什么用es设置中断向量表呢?
mov word ptr es:[0*4+2],0
mov ax,4c00h
int 21h

do0:jmp short do0start
db"overflow!"
do0start:mov ax,cs
mov ds,ax
mov si,202h
mov ax,0b800h
mov es,ax
mov di,12*160+36*2;设置es:di指向显存空间的中间位置,这个地址怎么算出来的?
mov cx,9;设置cx为字符串长度
s:mov al,[si]
mov es:[di],al
inc si
add di,2
loop s
mov ax,4c00h
int 21h
do0end :nop;为什么加nop?
code ends
end start
//1 怎样用汇编申请内存?
//2程序是用记事本写成的,编译连接后,怎样触发中断?
//3 es:[di+idata],idata应该是16进制计算?
//4 程序中两次用到计数器cx
mov cx,offset do0end-offset do0;设置cx传输长度
mov cx,9;设置cx为字符串长度
是不是没有触发中断时前者把do0对应的二进制码送入内存0:200处(而此时的mov cx,9因为没有被触发,所以不会和mov cx,offset do0end-offset do0冲突),
//5 程序末尾为什么加nop do0end :nop
//6 mov si,202h 应该是指向字符串"overflow!"
do0start:mov ax,cs
mov ds,ax
mov si,202h
可否改成:mov si,offset(do0)+2
...全文
296 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
longfengxiang 2008-10-10
  • 打赏
  • 举报
回复
谢谢,可是偶的分数太少了。怎么办啊!!!
xtdumpling 2008-10-09
  • 打赏
  • 举报
回复
试着回答下,
1.Dos下的内存就自己用,一般不用申请的,单任务的
2.写一个小程序在里面做一个除0的运算就会触发中断0了
3.es:[di+idata],idata应该是16进制计算?
不知道你为什么要这么问, xxh是十六进制, xx or xxd是十进制, xxb是二进制, .asm文件里面是这样的
4.这个程序执行的时候,do0后面的都没有被执行.只有产生int 0的时候才会跑do0后面这些.
你可以理解为两个程序,前面一个把后面一个载入就退出了,后面一个等Int 0才会执行.
5.因为do0end这个标记处的字节也会被copy到,所以就填了个空指令
6.不可以! 编译时 offset(do0)+2 很可能不等于 202h,offset()是由编译器计算的

21,500

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧