永久免费自动建站系统,网络营销的内容主要包括哪些方面,怎么做单向网站链接,wordpress汉语插件int指令的最终功能和call指令类似#xff0c;都是调用一段程序
两者的根本区别表现在服务时间和服务对象上不一样。#xff08;本段叙述参考原文#xff1a;http://blog.csdn.net/jxq0816/article/details/50121563#xff09; 1#xff09;调用子程序发生的时间是已知的…int指令的最终功能和call指令类似都是调用一段程序
两者的根本区别表现在服务时间和服务对象上不一样。本段叙述参考原文http://blog.csdn.net/jxq0816/article/details/50121563 1调用子程序发生的时间是已知的和固定的即在主程序的调用指令CALL执行时发生主程序调用子程序过程调用指令所在位置是已知的和固定的而中断过程发生的时间一般是随机的CPU在执行某一主程序时受到中断源提出的中断申请就发生中断过程而中断申请一般由硬件电路产生申请时间是随机的。也可以说调用子程序是程序设计者事先安排好的而执行中断服务程序是由系统工作环境随机决定的。 2子程序完全为主程序服务两者属于主从关系。主程序需要子程序时就去调用子程序并把调用结果带回主程序继续执行。而中断服务程序与主程序二者一般是无关的两者是平行关系。 3主程序调用子程序的过程完全属于软件处理过程不需要专门的硬件电路而中断处理系统是一个软、硬件结合的系统需要专门的硬件电路才能完成中断处理的过程。 4子程序嵌套可以实现若干级嵌套的最多级数受计算机内存开辟的堆栈大小限制而中断嵌套级数主要由中断优先级来决定一般优先级不会很大。 从宏观上看虽然程序中断方式克服了程序查询方式中CPU踏步现象实现了CPU与IO并行工作提高了CPU的资源利用率但从微观操作分析CPU在处理中断程序时仍需暂停原程序的正常运行尤其是当高速I/O设备或辅助存储器频繁地、成批地与主存交换信息时需不断打断CPU执行现行程序而执行中断服务程序。
在完成这个实验时可参看下面相关的附注实验。
1
安装程序 assume cs:codesg codesg segment
start: mov ax, cs mov ds, ax mov si, offset show_str ;设置ds:si指向源地址 mov ax, 0 mov es, ax mov di, 200h ;设置es:si指目的地址 mov cx, offset show_strend - offset show_str ;设置cx传输长度 cld rep movsb mov ax, 0 ;设置中断向量表 mov es, ax mov word ptr es:[7ch*4], 200h mov word ptr es:[7ch*42], 0 mov ax, 4c00h int 21h ;-------show_str---------------
show_str: push si push di push cx push bx mov bl, cl mov ax, 0b800h mov es, ax mov di, 0 mov al, 160 mul dh mov di, ax mov al, 2 ;es:di point to display memory mul dl add di, ax s: xor cx, cx mov cl, ds:[si] jcxz ok mov es:[di0], cl mov es:[di1], bl add si, 1 add di, 2 jmp s ok: pop bx pop cx pop di pop si iret show_strend:nopcodesg ends
end start 应用程序 assume cs:codedata segmentdb welcome to masm!, 0
data endscode segment
start: mov dh, 10mov dl, 10mov cl, 2mov ax, datamov ds, axmov si, 0int 7chmov ax, 4c00hint 21hcode ends
end start实验结果 体会show_str既可以用call子程序方式来调用也可以用中断的方式来调用这两者有各自的特点和用途本篇开头已经略述。 2
附三中已经有类似实现这里略去。 3下面的程序分别在屏幕的第2,4,68行显示4句英文诗补全程序。
代码如下 assume cs:code ;不写start默认从cs:0开始读取指令code segment
s1: db Good,better,best,,$
s2: db Never let it rest,,$
s3: db Till good is better,,$
s4: db And better,best.,$
s: dw offset s1,offset s2,offset s3,offset s4
row: db 2,4,6,8start: mov ax, csmov ds, axmov bx, offset smov si, offset rowmov cx, 4ok: mov bh, 0mov dh, ds:[si]mov dl, 0mov ah, 2int 10hmov dx, ds:[bx]mov ah, 9int 21hadd bx, 2inc siloop okmov ax, 4c00hint 21hcode ends
end start实验结果 实验体会
这个才是在现实中解决问题的方式--》用别人已经造好的轮子。世界要靠大家的合作才能更好的发展自己直接用别人的轮子即可但是首先你好了解别人的轮子是怎么造的完全不理会原理而只会使用有可能被组装出来的“汽车”非常的难用。总之研究其理用其产品。 附一编写安装中断7ch中断例程实现word型数据求平方课本253页
1安装程序代码 assume cs:codesg codesg segment
start: mov ax, cs mov ds, ax mov si, offset sqr ;设置ds:si指向源地址 mov ax, 0 mov es, ax mov di, 200h ;设置es:si指目的地址 mov cx, offset sqrend - offset sqr ;设置cx传输长度 cld rep movsb mov ax, 0 ;设置中断向量表 mov es, ax mov word ptr es:[7ch*4], 200h mov word ptr es:[7ch*42], 0 mov ax, 4c00h int 21h ;sqr------------------------
sqr: mul axiret
sqrend: nopcodesg ends
end start 2应用代码 assume cs:codesgcodesg segment
start: mov ax, 3456int 7chadd ax, axadc dx, dxmov ax, 4c00hint 21hcodesg ends
end start3实验结果 附二编写安装中断7ch中断例程实现字符串字母全变成大写课本254页
1安装程序代码 assume cs:codesg codesg segment
start: mov ax, cs mov ds, ax mov si, offset capital ;设置ds:si指向源地址 mov ax, 0 mov es, ax mov di, 200h ;设置es:si指目的地址 mov cx, offset capitalend - offset capital ;设置cx传输长度 cld rep movsb mov ax, 0 ;设置中断向量表 mov es, ax mov word ptr es:[7ch*4], 200h mov word ptr es:[7ch*42], 0 mov ax, 4c00h int 21h ;capital------------------------
capital:push cxpush si
change: mov cl, [si]mov ch, 0jcxz okand byte ptr [si], 11011111binc sijmp short changeok: pop sipop cxiretcapitalend:nop
codesg ends
end start 2应用程序 assume cs:codesgdata segmentdb conversation, 0
data endscodesg segment
start: mov ax, datamov ds, axmov si, 0int 7chmov ax, 4c00hint 21hcodesg ends
end start
3实验结果 附三:编写安装中断7ch中断例程实现loop指令功能课本256页
1安装程序 assume cs:codesg codesg segment
start: mov ax, cs mov ds, ax mov si, offset lp ;设置ds:si指向源地址 mov ax, 0 mov es, ax mov di, 200h ;设置es:si指目的地址 mov cx, offset lpend - offset lp ;设置cx传输长度 cld rep movsb mov ax, 0 ;设置中断向量表 mov es, ax mov word ptr es:[7ch*4], 200h mov word ptr es:[7ch*42], 0 mov ax, 4c00h int 21h ;lp------------------------
lp: mov bp, spdec cxjcxz lpretadd [bp0], bx
lpret: iret
lpend: nopcodesg ends
end start 2应用程序 assume cs:codesg codesg segment
start: mov ax, 0b800hmov es, axmov di, 160*12mov bx, offset s - offset semov cx, 8
s: mov byte ptr es:[di], !add di, 2int 7ch
se: nopmov ax, 4c00h int 21h codesg ends
end start 3实验结果 附四调用BIOS中断例程
int10中断例程是bios提供的中断例程其中包含了多个和屏幕输出相关的子程序确定子程序要通过ah来传递内部子程序的编号代码如下 assume cs:codesg codesg segment
start: mov ah, 9mov al, amov bl, 11001010bmov bh, 0mov cx, 3int 10hmov ax, 4c00h int 21h codesg ends
end start 实验结果附五调用dos中断例程在屏幕的第5行12列显示字符串“Welcome to masm!”
mov ax, 4c00h
int 21h
int 21h中断例程是dos提供的中断例程其中包含了dos提供给程序员在编程时调用的子程序。int 21h中断例程的4ch号子程序是返回功能。
ah9表示调用第21h号中断例程的第9号子程序功能为在光标位置显示字符串可以提供要显示的字符串的地址作为参数。
代码如下 assume cs:codesg data segmentdb Welcome to masm!, $
data endscodesg segment
start: mov ah, 2 ;置光标mov bh, 0 ;第0页mov dh, 5 ;dh行mov dl, 12 ;dl列int 10h ;BIOS中断mov ax, datamov ds, axmov dx, 0 ;point to first address of datamov ah, 9int 21hmov ax, 4c00h int 21h codesg ends
end start 实验结果从实验四五可以看出遇到打印相关的需求直接调用BIOS操作系统的相关中中断例程即可无需自己再造轮子。