汇编语言05课件_第1页
汇编语言05课件_第2页
汇编语言05课件_第3页
汇编语言05课件_第4页
汇编语言05课件_第5页
已阅读5页,还剩82页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第5章教学重点在掌握基本的汇编语言程序设计方法之后,进一步学习如何提高编程效率的各种实用方法:高级语言特性宏结构模块化5.1高级语言特性MASM6.0引入高级语言的程序设计特性条件控制伪指令.IF.ELSE.ENDIF循环控制伪指令.WHILE.ENDW.REPEAT.UNTIL过程声明和过程调用伪指令.PROTO.INVOKE条件表达式中的操作符操作符功能操作符功能操作符功能==等于&&逻辑与CARRY?CF=1?!=不等于||逻辑或OVERFLOW?OF=1?>大于!逻辑非PARITY?PF=1?>=大于等于SIGN?SF=1?<小于&位测试ZERO?ZF=1?<=小于等于()改变优先级第5章;单分支结构 .IFAX<0 negax .ENDIF movresult,ax;双分支结构 .IFax==5 movbx,ax movax,0 .ELSE decax .ENDIF;双分支结构 .IFax==5* cmpax,05h* jne@C0001 movbx,ax movax,0 .ELSE* jmp@C0003*@C0001: decax .ENDIF*@C0003:例题 .data_a sbyte?_b sbyte?_c sbyte?tag byte?

.code

.startup moval,_b imulal movbx,ax ;bx中为b2 moval,_a imul_c movcx,4 imulcx ;ax中为4ac例5.1-1/2 .ifswordptrbx>=ax ;比较二者大小

movtag,1 ;第一分支体:条件满足,tag←1 .else

movtag,0 ;第二分支体:条件不满足,tag←0 .endif

.exit0

例5.1-2/2WHILE循环结构的流程图第5章;WHILE结构 xorax,ax movcx,100

.whilecx!=0 addax,cx deccx

.endw movsum,ax求1~100之和;UNTIL结构 xorax,ax movcx,100

.repeat addax,cx deccx

.untilcx==0 movsum,ax要调用带参数过程定义的过程,不应采用CALL指令,因为比较烦琐应该采用过程调用伪指令INVOKE使用INVOKE伪指令的前提是需要用PROTO伪指令对过程进行声明5.1.3过程声明和过程调用伪指令过程名 PROC

调用距离

语言类型作用范围<起始参数> USES寄存器列表,参数:类型 LOCAL参数表

… ;汇编语言语句过程名 ENDP过程声明伪指令:用于事先声明过程的结构过程名

PROTO

调用距离语言类型,参数:类型过程调用伪指令

INVOKE

过程名,参数,...如何调用;汇编语言程序:lt503.asm .modelsmallchecksumdPROTOc,:word,:word ;声明过程 .stack .dataarray db12h,25h,0f0h,0a3h,3 db68h,71h,0cah,0ffh,90hcount equ$-array

;数组的元素个数result db? ;校验和 .code .startup

INVOKEchecksumd,count,offsetarray

;调用过程 movresult,al ;保存校验和 .exit0例5.3-1/2列表文件checksumdPROCcUSESbxcx,\ countp:word,arrayp:word

movbx,arrayp ;BX←数组的偏移地址

movcx,countp ;CX←数组的元素个数 xoral,alsumd: addal,[bx] ;求和:AL←AL+DS:[BX] incbx loopsumd retchecksumdendp end例5.3-2/2列表文件;lt503.asm的列表文件(lt503.lst)

...INVOKEchecksumd,count,offsetarray* movax,wordptrOFFSETarray* pushax* movax,+000Ah* pushax* callchecksumd* addsp,04h

movresult,al

...例5.3-1/2指示该语句由汇编程序自动生成checksumdPROCcUSESbxcx,\ countp:word,arrayp:word* pushbp ;起始代码* movbp,sp* pushbx ;保护bx和cx* pushcx movbx,arrayp ;arrayp=[BP+6] movcx,countp ;countp=[BP+4] ...

ret* popcx ;结尾代码* popbx* popbp* ret0000hchecksumcendp例5.3-2/2进入调试程序观察宏——具有宏名的一段汇编语句序列——宏定义时书写宏指令——这段汇编语句序列的缩写——宏调用时书写宏展开——宏指令处用这段宏代替的过程——宏汇编时实现宏的参数功能强大,颇具特色配合宏,还有宏操作符和有关伪指令5.2.1宏汇编宏定义宏名 macro[形参表] 宏定义体

endmmainbegin MACRO

;;定义名为mainbegin的宏,无参数 movax,@data ;;宏定义体 movds,ax

ENDM ;;宏定义结束mainend MACROretnum ;;带有形参retnum moval,retnum ;;宏定义中使用参数 movah,4ch int21h

ENDM宏注释符宏展开宏展开——在汇编时,用宏定义体的代码序列替代宏指令的过程。start: mainbegin ;宏指令1 movax,@data ;宏展开1 movds,ax

mainend0 ;宏指令1 moval,0 ;宏展开1 movah,4ch1 int21h宏的参数宏的参数使用非常灵活宏定义时,可以无参数,例如5.4a的mainbegin可以带有一个参数,例如5.4a的mainend也可以具有多个参数;例如5.5a的shlext参数可以是常数、变量、存储单元、指令(操作码)或它们的一部分,也可以是表达式;例如5.5b的shift和shrot宏定义体可以是任何合法的汇编语句,既可以是硬指令序列,又可以是伪指令序列;例如5.6的dstring;统一4条移位指令的宏指令shift macrosoprand,snum,sopcode pushcx movcl,snum s&sopcode&soprand,cl popcx endm;统一移位和循环移位8条指令的宏指令shrot macrosroprand,srnum,sropcode pushcx movcl,srnum

sropcodesroprand,cl popcx endm例5.5b替换操作符;宏定义dstring macrostring db’&string&’,0dh,0ah,’$’ endm;宏调用dstring <Thisisaexample.>dstring <0!<Number!<10>;宏展开1 db’Thisisaexample.’,0dh,0ah,’$’1 db’0<Number<10’,0dh,0ah,’$’例5.6转义注释符传递注释符宏操作符;;——宏注释符,用于表示在宏定义中的注释。采用这个符号的注释,在宏展开时不出现&——替换操作符,用于将参数与其他字符分开。如果参数紧接在其他字符之前或之后,或者参数出现在带引号的字符串中,就必须使用该伪操作符第5章与宏有关的伪指令局部标号伪指令LOCAL标号列表宏定义体采用了标号,应使用LOCAL加以说明它必须是宏定义MACRO语句之后的第一条语句宏定义删除伪指令PURGE宏名表不需要某个宏定义时,可以把它删除宏定义退出伪指令EXITM伪指令EXITM表示结束当前宏调用的展开;宏定义absol macrooprd localnext cmpoprd,0 jgenext negoprdnext: endm 例5.7;宏调用 absolwordptr[bx] absolbx;宏展开1 cmpwordptr[bx],01 jge??00001 negwordptr[bx]1 ??0000:1 cmpbx,01 jge??00011 negbx1 ??0001:单独占一行比较仅是源程序级的简化:宏调用在汇编时进行程序语句的展开,不需要返回;不减小目标程序,执行速度没有改变通过形参、实参结合实现参数传递,简捷直观、灵活多变还是目标程序级的简化:子程序调用在执行时由CALL指令转向、RET指令返回;形成的目标代码较短,执行速度减慢需要利用寄存器、存储单元或堆栈等传递参数宏子程序宏与子程序具有各自的特点,程序员应该根据具体问题选择使用那种方法通常,当程序段较短或要求较快执行时,应选用宏;当程序段较长或为减小目标代码时,要选用子程序比较

结论宏子程序5.2.2重复汇编重复汇编指在汇编过程中,重复展开一段(基本)相同的语句重复汇编没有名字,不能被调用重复汇编常用在宏定义体中,也可以在一般汇编语句中使用重复汇编伪指令有三个:REPEAT——按参数值重复FOR——按参数个数重复FORC——按参数的字符个数重复最后,用ENDM结束按参数值重复REPEAT重复次数重复体ENDMchar='A'REPEAT26dbcharchar=char+1ENDM1 dbchar ;等效于db'A'1 char=char+11 dbchar ;等效于db'B'1 char=char+1 ...1 dbchar ;等效于db'Z'1 char=char+1按参数个数重复FOR形参,〈实参表〉重复体ENDMFORregad,<ax,bx,cx,dx>pushregadENDM1 pushax1 pushbx1 pushcx1 pushdx按参数字符个数重复FORC

形参,字符串重复体ENDMFORCregad,dcbapop®ad&xENDM1 popdx1 popcx1 popbx1 popax5.2.3条件汇编条件汇编伪指令在汇编过程中,根据条件决定汇编的语句IFxx表达式

;满足,汇编分支语句体1

分支语句体1[ELSE

;不满足,汇编分支语句体2

分支语句体2]ENDIF

;条件汇编结束pdata macronum

IFnumlt100 ;;如果num<100,则汇编如下语句 dbnumdup(?)

ELSE ;;否则,汇编如下语句 db100dup(?)

ENDIF endm pdata12 ;宏调用① db12dup(?) ;宏汇编结果① pdata102 ;宏调用② db100dup(?) ;宏汇编结果②例5.10宏

用宏汇编、重复汇编和条件汇编 为源程序的编写提供了很多方便, 灵活运用它们可以编写出非常 良好的源程序来

汇编系统中有些以圆点起始的 伪指令(如.startup、.exit等) 实际上是一种宏结构dstring MACROstring ;;定义字符串 db'&string&',0dh,0ah,'$' ENDMmainbegin MACROdsseg ;;设置数据段地址 movax,dsseg movds,ax ENDMdispmsg MACROmessage movdx,offsetmessage movah,09h int21h ENDM例题5.4-1/3mainend MACROretnum ;;返回DOS,可不带参数 ifb<retnum> movah,4ch ;;没有参数 else movax,4c00h+(retnumAND0ffh)

;;有参数 endif int21h ENDM例题5.4-2/3

.modelsmall .stack256 .datamsg1 equthisbytedstring <Hello,Everybody!!>msg2 equthisbytedstring <Yousee,Imadeit.> .codestart: mainbegin@data ;建立DS内容

dispmsgmsg1 ;显示msg1字符串

dispmsgmsg2 ;显示msg2字符串

mainend

;返回DOS endstart例题5.4-3/3将程序分段、采用子程序或宏结构都是进行模块化程序设计介绍开发大型程序时采用的方法:源程序文件的包含目标模块连接子程序库5.3模块化程序设计例题5.12将键盘输入的数据按升序输出把源程序分放在几个文本文件中,在汇编时通过包含伪指令INCLUDE结合成一体INCLUDE

文件名可将常用的子程序形成.ASM汇编语言源文件可将常用的宏定义存放在.MAC宏库文件中可将常量定义、声明语句组织在.INC包含文件中例5.12a①宏库文件lt512a.mac②主程序文件lt512a.asm③子程序文件sub512a.asm5.3.1源程序文件的包含1dispchar

macrochar ;显示char字符

movdl,char movah,2 int21h endmdispmsg

macromessage ;显示message字符串

movdx,offsetmessage movah,9 int21h endmLt512a.mac

includelt512a.mac

...

dispmsgmsg1 ;提示输入数据

movbx,offsetbuf

callinput ;数据输入

cmpcx,0 jestart4 ;没有输入数据则退出

movcount,cx ... ;显示输入的数据 ... ;数据排序 ... ;显示经排序后的数据start4: .exit0

includesub512a.asm

endLt512a.asm子程序源文件有3个子程序ALdisp ;显示2位16进制数子程序(例4.10)sorting ;排序子程序(例4.8)input ;键盘输入子程序还包含一个宏convert ;;将DX两位ASCII码转换为两位16进制数sub512a.asm让我们重点分析键盘输入子程序input;键盘输入子程序;入口参数:ds:bx=存放数据的缓冲区;出口参数:cx=数据个数input

proc pushax pushdx xorcx,cx ;数据个数清0input01: xordx,dx ;输入字符清0input02: movah,1 ;键盘输入一个字符 int21hinput之一继续:input之二input10: cmpal,0dh jeinput30;是回车,结束整个数据的输入

cmpal,’’ jeinput20;是空格和逗号,确认输入了一个数据

cmpal,’,’ jeinput20 cmpal,08h jeinput17;是退格,丢弃本次输入的数据,出错input之二继续:input之三

cmpal,’0’

;有效数字判断(图5.2b)

jbinput17 ;小于’0’,不是有效数字,出错

cmpal,’f’ jainput17

;大于’f’,不是有效数字

cmpal,’a’ jbinput11 subal,20h

;’a’~’f’转换成大写’A’~’F’

jmpinput12input11: cmpal,’F’ jainput17 ;字符小于’a’、大于’F’,出错

cmpal,’A’ jaeinput12

;是’A’~’F’,有效字符

cmpal,’9’ jainput17

;是’0’~’9’,有效字符input之三继续:input之四input12: cmpdl,0 ;有效字符的处理

jneinput13 movdl,al;dl=0,输入了一个数据的低位,则dl←al

jmpinput02 ;转到字符输入input13: cmpdh,0 jneinput17;dl≠0,dh≠0输入3位数据,出错

movdh,dl;dl≠0,dh=0输入了一个数据的高位

movdl,al ;dh←dl,dl←al

jmpinput02 ;转到字符输入input之四继续:input之五input17: movdl,7 ;输入错误处理

movah,2 int21h movdl,'?' movah,2 int21h jmpinput01 ;转到输入一个数据input之五继续:input之六;转换正确的输入数据(图5.2c)input20: convert

jmpinput01 ;转到输入一个数据input30: convert

popdx popax ret ;返回,出口参数已设定input endpinput之六继续:convert之一;;将DX两位ASCII码转换为两位16进制数(图5.2c)convert macro localinput21,input22 localinput24,input25 cmpdl,0 ;;dl=0,没有要转换的数据,退出

jeinput25convert之一继续:convert之二

cmpdl,'9' jbeinput21 subdl,7 ;;字符A~F,则减7input21: anddl,0fh ;;转换低位

cmpdh,0 ;;dh=0,没有高位数据

jeinput24

cmpdh,'9' jbeinput22 subdh,7input22: shldh,1 shldh,1 shldh,1 shldh,1 ;;转换高位

ordl,dh ;;合并高、低位convert之二继续:convert之三源文件包含的操作步骤:①分别编辑生成各个文件②汇编、连接主程序文件input24: mov[bx],dl ;;存入缓冲区

incbx inccx ;;数据加1input25: endmconvert之三把常用子程序写成独立的源程序文件,单独汇编,形成子程序的目标文件.OBJ主程序也经过独立汇编之后形成目标文件连接程序将所有目标文件连接起来,最终产生可执行文件需要遵循的原则:①声明共用的变量、过程等②实现正确的段组合③处理好参数传递问题5.3.2目标代码文件的连接2声明共用的变量、过程各个模块间共用的变量、过程等要说明PUBLIC标识符[,标识符...] ;定义标识符的模块使用EXTERN

标识符:类型[,标识符:类型...] ;调用标识符的模块使用标识符是变量名、过程名等类型是byte/word/dword(变量)或near/far(过程)在一个源程序中,public/extern语句可以有多条各模块间的public/extern伪指令要互相配对,并且指明的类型互相一致实现正确的段组合子程序文件必须定义在代码段中,也可以具有局部的数据变量采用简化段定义格式,只要采用相同的存储模式,容易实现正确的近或远调用完整段定义格式中,为了实现模块间的段内近调用(near类型),各自定义的段名、类别必须相同,组合类型都是public。实际的程序开发中,各个模块往往由不同的程序员完成,不易实现段同名或类别相同,所以索性定义成远调用(far类型)定义数据段时,同样也要注意这个问题。当各个模块的数据段不同时,要正确设置数据段DS寄存器的段基地址处理好参数传递问题少量参数可用寄存器或堆栈直接传送数据本身大量数据可以安排在缓冲区,用寄存器或堆栈传送数据的存储地址还可利用变量传递参数,但是要采用public/extern声明为公共(全局)变量这些也是子程序间的参数传递方法另外,第7章混合编程介绍了更好的堆栈传递参数方法,可以采用例5.12b主程序lt512b.asm并入宏定义子程序文件sub512b.asm,要加上段定义语句、声明语句等,但不需要起始点和结束点模块连接的操作步骤:①分别编辑生成各个文件②分别汇编各个文件③连接各个目标文件,形成 可执行文件 ... ;宏定义 .code

publiccount ;定义count共用

externALdisp:near,sorting:near,input:far ;声明其他模块中的子程序 .startup ... .exit0 ;去掉(lt512a.asm中的)包含语句 endLt512b.asm

.modelsmall ;定义同样的存储模式

externcount:word ;在其他模块定义了字变量count

.code ;子程序在代码段中

publicaldisp,sorting,input ;3个子程序是共用的Aldisp proc ;仍然作为近调用sorting proc ;仍然作为近调用input procfar ;修改为远调用 ...

movcount,cx ;提供出口参数 ...input endp

end ;结束汇编sub512b.asm把常用子程序写成独立的源文件,单独汇编形成OBJ文件后,存入子程序库主程序也单独汇编形成OBJ文件主程序连接时,调入子程序库中的子程序模块,产生最终的可执行文件例5.12c①主程序文件lt512c.asm②子程序文件sub512c1.asm③子程序文件sub512c2.asm④子程序文件sub512c3.asm5.3.3子程序库的调入3子程序库子程序库文件(.LIB)是子程序模块的集合,其中存放着各子程序的名称、目标代码及有关定位信息存入库的子程序的编写与目标文件连接方法中的要求一样,只是为方便调用,更加严格子程序文件编写完成后,汇编形成目标文件;然后利用库管理工具程序LIB.EXE,把子程序目标模块逐一加入到库中

LIB

库文件名

+子程序目标文件名库管理程序LIB帮助创建、组织和维护子程序模块库,例如增加、删除、替换、合并库文件等第5章... ;宏定义.codeexternALdisp:near,sorting:near,input:near ;声明其他模块中的子程序.startup....exit0endLt512c.asm

.modelsmall .code publicaldispAldisp proc ...Aldisp endp

endsub512c1.asm

.modelsmall .code publicsortingsorting proc ...sorting endp

endsub512c2.asm

.modelsmall .code publicinputinput proc ...input endp

endsub512c3.asm库文件调入的操作步骤:①分别编辑生成各个文件②分别汇编各个文件③用库管理文件,将子程序模块添加到库文件(.LIB)中④连接主程序,提供库文件, 形成可执行文件补充例题将子程序应用的例题4.13~4.15的子程序编写成模块,供主程序调用实现功能:从键盘输入有符号十进制数,求它们的平均值,然后输出源程序文件进行简单修改主程序文件子程序文件利用目标代码文件的连接形成可执行文件 .modelsmallexternread:near,write:near,mean:near

;外部子程序

publicwtemp

;变量共用 .stack

.data … ;数据定义 .code … ;输入、计算和输出 end主程序文件 .modelsmall

publicread,write,mean

;子程序共用

externwtemp:word

;外部变量 .code ;代码段read proc …… ;输入子程序readwrite proc …… ;输出子程序writemean proc …… ;计算平均值子程序mean end子程序文件5.4输入输出程序设计输入指令IN从外设读取数据输出OUT指令向外设提供数据处理器通过I/O接口控制外设参考I/O指令第2.1.5节建议结合硬件相关课程学习5.4.1程序直接控制输入输出程序执行IN或OUT指令实现数据传送 .modeltiny ;形成com格式的程序 .code .startup

callspeaker_on

;打开扬声器声音 movah,1 ;等待按键 int21h

callspeaker_off ;关闭扬声器声音 .exit0例5.13:主程序speaker_onproc ;扬声器开子程序

pushax

inal,61h ;读取原来控制信息

oral,03h ;D1D0=PB1PB0=11b

out61h,al ;直接控制发声

popax retspeaker_onendp例5.13:子程序扬声器关;扬声器关子程序speaker_off

andal,0fch ;D1D0=PB1PB0=00b

5.4.2程序查询输入输出程序需要查询外设状态,然后进行数据交换实际的输入输出程序可以规定一个超时参数打印机查询输出的控制:要打印的字符首先提供给数据端口然后查询状态端口,确定打印机是否可以接受如果打印机还没有准备好接受数据,则继续检测一个固定时间如果打印机能够接受数据,处理器利用控制端口将数据提供给打印机 movcx,(sizeofokmsg)-1 movsi,offsetokmsgprnbegin:

movdx,378h ;打印机基地址

movbx,100 ;超时参数

moval,[si] ;打印字符

callprintchar ;调用打印子程序

jcprnerr ;CF=1,不能打印

incsi ;CF=0,打印正常

loopprnbegin ;继续

movdx,offsetokmsg;显示正确

jmpprnokprnerr: movdx,offseterrmsg;显示错误prnok: movah,9 int21h例5.14:主程序printcharproc pushcx

outdx,al ;向数据端口输出打印字符

incdx ;基地址加1成为状态端口print0: subcx,cxprint1: inal,dx ;查询状态端口

testal,80h ;最高位D7反映打印机状态

jnzprint2 ;D7=1,可以接收打印数据

loopprint1 ;D7=0,不能接收打印数据

decbl ;超时参数减1

jnzprint0 ;循环检测

stc ;规定时间内没有准备好

jmpprint3 ;退出打印例5.14:打印子程序1/2print2: incdx ;基地址再加1成为控制端口 moval,0dh ;使最低位D0=1

outdx,al nop ;延时 moval,0ch ;使最低位D0=0

outdx,al

;产生选通脉冲,将打印字符送入打印机

clc

;设置正常标志CF=0print3: popcx ret ;返回printcharendp例5.14:打印子程序2/25.4.3中断服务程序需要交换数据的外设,采用中断请求向处理器提出要求处理器执行事先设计好的中断服务程序,在中断服务程序当中实现数据交换8086可以处理256种中断,分为内部、外部两种类型外部可屏蔽中断用于与外设进行数据交换1.内部中断服务程序主程序通过中断调用指令INTn执行内部中断服务程序,其实质相当于子程序调用编写内部中断服务程序与编写子程序雷同利用过程定义伪指令PROC/ENDP但通常要执行STI指令开放可屏蔽中断最后执行IRET指令返回调用程序内部中断服务程序常用寄存器传递参数设置中断向量:AH=25H(INT21H)获取中断向量:AH=35H(INT21H) .dataintoff dw?

;保存原偏移地址intseg dw?

;保存原段地址 .code

movax,3580h ;获取中断80H的中断向量 int21h movintoff,bx ;保存偏移地址 movintseg,es ;保存段基地址例5.15a:1/5获取中断向量:AH=35H(INT21H)入口参数:AL=中断向量号出口参数:ES:BX=中断服务程序的入口地址(段基地址:偏移地址)

pushds

movdx,offsetnewint80h movax,segnewint80h movds,ax movax,2580h ;设置中断80H的入口地址 int21h

popds例5.15a:2/5设置中断向量:AH=25H(INT21H)入口参数:AL=中断向量号ES:BX=中断服务程序的段基地址:偏移地址

int80h

;调用中断80h的服务程序,显示信息 movdx,intoff ;恢复中断80H的入口地址 movax,intseg movds,ax movax,2580h int21h .exit0 ;返回DOS例5.15a:3/5设置中断向量:AH=25H(INT21H)入口参数:AL=中断向量号ES:BX=中断服务程序的段基地址:偏移地址newint80h proc ;内部中断服务程序

sti ;开中断 pushax ;保护现场 pushbx pushcx pushsi movsi,offsetintmsg ;获取显示字符串首地址 movcx,sizeofintmsg ;获取显示字符串个数例5.15a:4/5disp: moval,cs:[si] ;获取显示字符 movbx,0 ;显示一个字符 movah,0eh int10h incsi loopdisp popsi ;恢复现场 popcx popbx popax

iret

;中断返回intmsg db'IamGreat!',0dh,0ah ;显示信息newint80h endp例5.15a:5/52.驻留中断服务程序驻留TSR程序:程序执行结束,但保留在系统主存中,可以让其他程序使用方法:利用DOS功能31h代替4ch终止程序程序驻留返回:AH=25H(INT21H)入口参数:AL=返回代码DX=程序驻留的容量(节,1节=16个字节) .modeltiny .code .startup ;等价于org100h

jmpstart ;跳转到本程序的开始位置newint80h proc ;驻留的中断服务程序 ... ;同例题5.15a过程newint80h endp ;中断服务程序结束start: movax,cs ;主程序开始位置 movds,ax movdx,offsetnewint80h movax,2580h int21h ;设置80h的中断向量

int80h ;调用一下看看例5.15b:1/2 movdx,offsetistmsg ;显示驻留成功 movah,9 int21h

movdx,(offsetstart)+15

;计算驻留程序的长度(需多加15个字节)

movcl,4 shrdx,cl ;除以16转换成“节”

movax,3100h

;中断服务

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论