硬件学习文档_第1页
硬件学习文档_第2页
硬件学习文档_第3页
硬件学习文档_第4页
硬件学习文档_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

第1章汇编语言程序设计基础PAGE17第1章汇编语言程序设计基础1.1.2数据定义通过数据定义语句可为数据项分配存储单元,并根据需要设置其初值。还可用符号代表数据项,此时符号就与分配的存储单元相联系。代表数据项的符号本身称为变量名,与之相对应的存储单元用于存放变量,所以常常就把这样的存储单元称为变量。[例1.1]定义字节数据COUNT DB 100 ;定义一个字节的存储空间,存放100BUFF DB 3+4,5*6 ;定义两个字节的存储空间,存放7,30[例1.2]定义字数据FLAG1 DW 65530 ;定义一个字存储空间,存放65530FLAG2 DW 0F020H ;定义一个字存储空间,存放0F020H[例1.3]定义没有初值的数据项BUF 1 DW ?,? ;定义两个字存储空间,没有定义初值[例1.4]定义字符串MESS1 DB “HELLO!” ;定义一个字符串,内容是HELLO!MESS2 DB ‘H’,’E’,’L’,’L’,’O’,’!’ ;定义一个字符串,内容是HELLO![例1.5]重复操作符DUPBUF2 DB 5DUP(0) ;定义5个字节的存储空间,初值均为0[例1.6]使用EQU定义等值表达式COUNT EQU 234 ;[例1.7]使用等号定义COUNT=234 ;[例1.8]使用$定义$是一个特殊的地址表达式,表示当前地址。X DW 0,1,2,4,8,4,2,1,0 ;LEN DB $-X ;变量LEN的值等于181.2汇编语言程序的结构汇编语言源程序建立在段结构的基础上,一个段就是一些指令和数据的集合。所以一个汇编语言源程序,根据程序用途被划分成几段,如数据段、堆栈段、附加段和程序段(代码段),用CS、DS、SS、ES段寄存器存放段值。这样就构造了源程序的基本格式:DATA SEGMENT┊DATA ENDSEXTRA SEGMENT┊EXTRA ENDSSTACK1 SEGMENT┊STACK1 ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA ASSUME SS:STACK1,ES:EXTRASTART: MOV AX,DATA MOV DS,AX┊CODE ENDS END START结合上面的源程序结构格式,需要说明如下:互相配对的SEGMENT和ENDS前的标号必须一样;ASSUME语言使汇编程序得知哪一段是数据段(DS),哪一段是堆栈段(SS),哪一段是附加段(ES),哪一段是代码段(CS)。除CS段以外,各个段寄存器的实际值还要用MOV指令来赋予;ENDSTART表示源程序结束。下面,我们通过一个简单的汇编语言程序来说明汇编语言的结构DSEG SEGMENT ;数据段开始DATA1 DB 13H,26HDATA2 DW 0DSEG ENDS ;数据段结束SSEG SEGMENT STACK ;堆栈段开始SKTOP DB 20DUP(0)SSEG ENDS ;堆栈段结束CSEG SEGMENT ;代码段开始 ASSUME CS:CSEG,DS:DSEG ASSUME SS:SSEGSTART: MOV AX,DSEG ;初始化数据段基址 MOV DS,AX MOV AX,SSEG ;初始化代码段基址 MOV SS,AX MOV SP,LENGTHSKTOP ;设置堆栈指针 MOV AL,DATA1 ADD AL,DATA1+1 MOV BYTEPTRDATA2,AL MOV AH,4CH INT 21H ;返回DOSCSEG ENDS ;代码段结束 END START ;源程序结束说明如下:(1)DSEG是用户自定义的数据段的段名,SEGMENT和ENDS分别为表示段开始和结束的伪指令。(2)SSEG是堆栈段的段名,STACK表示此段是程序运行时使用的堆栈段,连接程序要求定义一个堆栈段,若无此段,连接程序指出“无堆栈段”错误。(3)CSEG是代码段的段名,一般要先用ASSUME语句指定哪一段是数据段,哪一段是堆栈段和代码段,但是段寄存器的实际地址仍需MOV指令赋予。(4)ENDSTART说明,START为程序的启动地址,即程序从这里开始执行,而END告诉汇编程序源程序到此结束,对END后面的任何语句都不再进行汇编。 第3章汇编语言程序设计实验命令格式功能说明A[地址]输入汇编指令C[范围]起始地址对由“范围”指定的区域与“起始地址”指定的同大小区域进行比较,显示不相同的单元D[范围]显示指定范围内的内存单元内容E地址字节值表用值表中的值替换从“地址”开始的内存单元内容F范围字节值表用指定的字节值表来填充内存区域G[=起始地址][断点地址]从起点(或当前地点)开始执行,到终点结束H数值1数值2显示二个十六进制数值之和、差I端口地址从端口输入L[地址[驱动器号扇区扇区数]]从磁盘读M范围地址把“范围”内的字节值传送到从“地址”开始的单元N文件标识符[文件标识符…]指定文件名,为读/写文件做准备O端口地址字节值向端口输出P[=地址][指令数]按执行过程,但不进入子程序调用或软中断Q退出DEBUG,不保存正在调试的文件R[寄存器名]显示和修改寄存器内容S范围字节值表在内存区域内搜索指定的字节值表。如果找到,显示起始地址,否则,什么也不显示T[=地址][指令数]跟踪执行,从起点(或当前地点)执行若干条指令U[范围]反汇编,显示机器码所对应的汇编指令W[地址[驱动器号扇区扇区数]]向磁盘写内容,(BX、CX)为写入字节数下面对DEBUG命令作具体介绍:内存显示命令D(DumpCommand)D命令用来显示内存单元的值,包括下列两种格式:D[<地址>]显示由指定地址开始的若干内存单元的值。对于80列显示模式,显示128个字节。如果未指定参数,则一个D命令的结束地址开始显示。若前面未用过D命令,则缺省从CS:IP开始显示。D<地址范围>该命令显示由<地址范围>指定的所有内存单元的值。执行D命令后,屏幕左边显示的是内存地址,中间是从该地址开始的若干字节值(十六进制),右边是每个字节对应得ASCII字符,其中,“.”表示不可打印字符。若只给出偏移地址,则使用DS当前值作为段地址。例如:D2000:100 ;显示从2000:0100H开始的内存单元的值D100 ;显示从DS:100H开始的内存单元的值DCS:100 ;显示从CS:100H开始的内存单元的值D ;显示从CS:IP开始的内存单元的值寄存器命令R(RegisterCommand)R命令用来显示和修改寄存器的值,包括下列两种格式。R显示所有寄存器和8个标志位的值,并反汇编CS:IP所指的命令。R<寄存器名>显示指定寄存器的值,并等待用户键入新的值,按回车键结束R的命令。其中,<寄存器名>只能是8086的16位寄存器AX、BX、CX、DX、SP、BP、SI、DI、DS、ES、SS、CS、IP、与F(标志寄存器)。其中,显示的8个标志位的符号对应符号如下表所示。标志名称溢出OF方向DF中断IF负号SF零ZF辅助进位AF奇偶PF进位CF置位状态OVDNEINGZRACPECY复位状态NVUPDIPLNZNAPONC如果想修改标志寄存器的内容,可以输入如下命令。-RF屏幕将显示8个标志位的值,然后等待用户修改。只要输入这些符号就可以设置对应标志位的值,键入符号的个数与顺序可以任意。反汇编命令U(UnassembleCommand)U命令用来将二进制代码反汇编为汇编语言的符号指令,包括下列两种格式。U[<地址>]从指令地址开始,反汇编若干字节。对于80列显示模式,反汇编32个字节(为了保证最后一条指令的完整性,可能会多于32个字节)。若未指定地址,则从上一个U命令的最后一个单元开始;若前面未用过U命令,则缺省为CS:IP。(2)U<地址范围>对指定范围的内存区进行反汇编。若只给出偏移地址,则使用CS当前值作为段地址。执行U命令后,屏幕左边显示的内存地址,中间是机器代码,右边是对应的汇编语言指令。运行命令G(GOCommand)G命令的格式为:G[=<地址>][<段点地址1><段点地址2>…<段点地址10>]其中,等号“=”后的<地址>指出程序执行的起始地址,如未指定,则缺省为CS:IP。指定的段点最多为10个,也可以没有。若只给出偏移地址,则使用CS当前值作为段地址。G命令从指定地址开始执行内存中的程序,直到内存结束或遇到指定的任意断点时停止执行。若遇到断点,则显示所有内存器和标志位的当前值以及要执行的下一条命令;若程序正常结束,则显示“Programterminatednormally”。说明:断点地址的次序是任意的。设置多个断点的好处在于当被调试程序有多条可能的执行路径时,使其不管沿哪个路径执行,都有可能在断点处停下来,以便检查程序的执行情况。断点一经设定,DEBUG用一条INT3指令取代断点处指令的操作码。当程序执行到一个断点地址时,立即停止,然后恢复所有断点处的指令,并取消全部断点,返回DEBUG。如果设置的断点在G命令的执行过程中均未遇到,则程序执行完毕,不会恢复断点处的指令。一旦程序执行完毕,若想再次执行,必须重新装入。对于G以及下面要介绍的T与P命令,等号“=”后的<地址>所有单元,必须是有效的8086指令代码,否则,会产生预想不到的结果。跟踪命令T(TraceCommand)T命令的格式为:T[=<地址>][<指令条数>]其中,等号“=”后的<地址>指出程序执行的开始地址,如未指定,则缺省为CS:IP。若只给出偏移地址,则使用CS当前值作为段地址。T命令从指定地址开始单步执行,执行的指令数由<指令条数>决定。每条指令执行后,都要显示所有寄存器和标志位的值以及下一条指令。若未给出<指令条数>,则缺省为1。T命令执行时,若遇到CALL或INT指令,会跟踪进入相应过程或中断服务程序内部。对于带重复前缀(如REP)的指令,每次重复执行算一步。退出命令Q(QuitCommand)Q命令的格式为:Q使用此命令可退出DEBUG。第3章汇编语言程序设计实验3.1顺序程序设计[程序1]设X和Y均为16位无符号数,写一个求表达式X+Y值的程序。程序清单如下:DSEGSEGMENT ;数据段XDW1234HYDW5678HZDW?DSEGENDSCSEGSEGMENT ;代码段ASSUMECS:CSEG,DS:DSEGSTART:MOVAX,DSEG ;段寄存器初值MOVDS,AXMOVAX,XADDAX,Y ;求x+y和MOVZ,AX ;保存MOVAH,4CHINT21H ;程序结束退出CSEGENDSENDSTART思考题:本程序没有考虑进位的情况。如果考虑可能产生的进位,应如何修改程序?扩展题:设X和Y均为三字节无符号数,编制程序求其和,并将结果放置在Z开始的存储单元。[程序2]设X、Y、Z为无符号字变量,编写程序计算表达式R=((X*Y+5)+4*X)/Z。在编写程序前,首先要确定该表达式的算法。第一步,计算X*Y;第二步,计算X*Y+5;第三步,计算4*X;第四步,计算(X*Y+5)+4*X;第五步,计算((X*Y+5)+4*X)/Z。程序清单如下所示。DATA SEGMENTX DW ?Y DW ?Z DW ?R DW 2DUP(0)DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX MOV AX,X MUL Y ;计算X*Y ADD AX,5 ;计算X*Y+5 ADC DX,0 MOV CX,DX MOV BX,AX MOV AX,X ;计算4*XMOV SI,4MUL SIADD AX,BX ;计算(X*Y+5)+4*XADC DX,CXDIV Z ;计算((X*Y+5)+4*X)/ZMOV R,AXMOV R+2,DXMOV AH,4CHINT 21HCODE ENDS END START思考题:程序中求4*X用乘法指令MUL实现,而用移位指令也可以实现,请问该如何修改程序?扩展题:编制程序计算Y=5X+7,设X值在DAX单元,结果存入RLT单元。X为无符号字节数据。[程序3]首先将FIRST字变量与SECOND字变量相加,结果存至THIRD1存储字中,然后将FIRST与SECOND两个字变量相乘,结果存至THIRD2开始的两个字中。FIRST和SECOND都是字变量,因此存放“和”的THIRD1单元也必须是字变量。而存放“积”的单元THIRD2必须是双字。程序清单如下:DATA SEGMENTFIRST DW 0D56CHSECOND DW 1F08HTHIRD1 DW ?THIRD2 DW 2DUP(?)DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX MOV AX,FIRST ADD AX,SECOND ;求和 MOV THIRD1,AX ;保存 MOV AX,FIRST MUL SECOND ;求积 MOV THIRD2,AX ;保存 MOV THIRD2+2,DX MOV AH,4CH INT 21HCODE ENDS END START思考题:假如FIRST的偏移地址是0000,那么THIRD2的偏移地址是多少?扩展题:设HEX,HEX+1单元的低4位分别存放一位十六进制数,编制程序将其装配在一个字节中并存入DATA单元,其中,HEX单元的数作为高位部分。附录3.2分支程序设计[程序1]设有3个单字节无符号数存放在BUF开始的缓冲区中,编写一个能将它们从大到小重新排序的程序。由于BUF缓冲区中只有3个数据,有多种方法可实现3个数据的排序。在此采用交换法,先找到3个数中的最大数,然后再找到剩下两个数的大数,最后将3个数据按大小依次存放。为了方便,先把要排序的3个数取到3个寄存器中,然后再对3个数进行比较排序。编写的源程序如下所示:DATA SEGMENTBUF DB 87,234,123DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AXMOV SI,OFFSETBUFMOV AL,[SI] ;把3个数取到寄存器中MOV BL,[SI+1]MOV CL,[SI+2]CMP AL,BL ;排序,将最大数送AL寄存器JAE NEXT1XCHG AL,BLNEXT1: CMP AL,CLJAE NEXT2XCHG AL,CLNEXT2: CMP BL,CL ;将最小数送CL寄存器JAE NEXT3XCHG BL,CLNEXT3: MOV [SI],AL ;从大到小依次存回缓冲区MOV [SI+1],BLMOV [SI+2],CLMOV AH,4CHINT 21HCODE ENDS END START思考题:分支结构程序设计的关键在于准确地知道操作结果影响的标志位状态和正确地使用条件转移指令。本程序中,由于是无符号数的比较,所以也可以根据一个标志位来判定数的大小,你能说出是哪个标志位吗,且程序中的JAE指令该用什么指令替换呢?扩展题:在BUF开始的单元里有3个单字节无符号数,编写程序找出它们中的最小值并存入MIN单元。[程序2]编写计算下面函数值的程序(x、y的值均在-128~+127之间)。输入数据为x、y,结果数据为Z。若x、y都大于0,z赋值1;若x、y都小于0,z赋值-1;若x、y异号,z赋值0。程序清单如下:DATA SEGMENTX DB 23Y DB -10Z DB 0DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AXCMP X,0 ;x与0进行比较JS L1 ;x〈0转L1CMP Y,0JL L2 ;y〈0转L2MOV Z,1 ;x〉=0,y〉=0则1—〉Z,无条件转EXITJMP EXITL1: CMP Y,0 ;y〉=0转L2JGE L2MOV Z,-1 ;x〈0,y〈0则-1—〉Z,无条件转EXITJMP EXITL2: MOV Z,0 ;x、y异号时则0—〉ZEXIT: MOV AH,4CHINT 21HCODE ENDS END START思考题:本程序中判定符号用的是CMP指令,而用逻辑操作指令也可以。比如,可以用AND指令,使其进行自身与操作,反应到SF标志位。还可以用TEST指令直接测试最高位,并将结果反应到ZF标志位,然后根据ZF标志判断。试用TEST指令编之。扩展题:如果不采用上述方法判断两数的符号,而采用两数异或的方法判断两数的符号,当两数的符号不相同时,其结果的最高位必定为1;当两数的符号相同时,其结果的最高位必定为0;在根据其中一数的符号是正还是负决定两数是正数还是负数。请作程序完成。3.3循环程序设计[程序1]已知以BUF为首地址的字存储区中存放着8个有符号二进制数,试编写程序将其中大于等于0的数依次送BUF1为首地址的字存储区中,小于0的数依次送以BUF2为首地址的字存储区中。同时将大于等于0的数的个数送A字变量,将小于0数的个数送B字变量。编写的程序清单如下:DATA SEGMENTBUF DW 23,123,-12,-210,45,0,90,-453BUF1 DW 8 DUP(0)BUF2 DW 8 DUP(0)A DW 0B DW 0DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AXLEA BX,BUF LEA SI,BUF1LEA DI,BUF2MOV A,0MOV B,0MOV CX,8 ;置循环初值L0: MOV AX,[BX] ;判断元素是否非负,非负则转L1CMP AX,0JGE L1MOV [DI],AX ;为负则将元素送BUF2,执行B+1ADD DI,2INC BJMP NEXTL1: MOV [SI],AX ;非负则将元素送BUF1,执行A+1ADD SI,2INC ANEXT: ADD BX,2 ;修改BUF的地址LOOP L0 ;修改循环次数,未完则转L0MOV AH,4CHINT 21HCODE ENDS END START思考题:本程序属于循环次数已知的程序,使用CX寄存器存放计数值,使用LOOP指令完成循环。但是在有些情况下,是不可以用LOOP指令的,比如循环中要用到移位指令时需要占用CL寄存器。我们仍可以两条指令完成完全相同的功能,请问是哪两条指令?扩展题:统计以BUF为首地址开始的字节数据块中的正数的个数,将统计结果放至RLT单元。[程序2]设STR字符串是以0结尾。试编写一个把字符串中的所有大写字母改为小写字母的程序,并将转换后的字符串显示输出。编写的程序清单如下:DATA SEGMENTSTR DB ‘HOWarEYoU!’,0DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV SI,OFFSETSTR ;取字符串开始地址AGAIN: MOV DL,[SI] ;取一字符OR DL,DL ;是否到字符串尾?JZ OK ;到字符串尾,转OKCMP DL,’A’ ;否则,判断是否为大写字母JB NEXT ;否,转NEXTCMP DL,’Z’JA NEXT ;否,转NEXTADD DL,20H ;是大写字母,改为小写字母MOV [SI],DL ;送回到字符串中NEXT: MOV AH,2INT 21HINC SI ;调整指针JMP AGAIN ;继续循环OK: MOV AH,4CHINT 21HCODE ENDS END START思考题:如果程序要求把小写字母都改为大写字母,程序段该如何修改?扩展题:有一系列以$为结束符的字符串,对其中的非数字字符计数,保存计数结果。[程序3]试编程从自然数1开始累加,直到累加和大于5050为止,统计被累加的自然数的个数,并把统计的个数送入COUNT单元,累加和送入TOTAL单元。显然,被累加的个数事先不知道,所以不能用计数法控制循环。应当利用累加和大于5050就停止累加这个条件来控制循环。程序清单如下:DATA SEGMENTCOUNT DW ?TOTAL DW ?DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX MOV CX,0 ;计数器清零 MOV AX,0 ;累加器清零 MOV BX,0LOOP1: INC BX ADD AX,BX ;累加 INC CX ;计数值加1 CMP AX,5050 ;比较 JLE LOOP1 ;小于等于则继续循环 MOV COUNT,CX ;保存结果 MOV TOTAL,AXCODE ENDS END START思考题:本程序的循环较为简单,请画出本程序的流程图。扩展题:从STRN地址开始有一字符串,以‘$’作为结束标志,要求统计该字符串长度并存于LENG单元。3.4综合程序设计[程序1]自内存DATA单元开始存放若干个无符号字节数,数据个数在COUNT单元存放。编制程序分别计算其中奇数、偶数的和,并分别存入ODDSUM,EVENSM单元。设各类和不超过16位二进制数,可用一个字表示或存放。本例对每一个数据进行判断、累加都是进行重复的操作,因此可编制循环结构程序,以COUNT控制循环的次数。主程序清单如下:DSEG SEGMENTDATA DB 15H,26H,03H,64H,8AH,0AAH,24H,48HCOUNT DW 08ODDSUM DW 0EVENSUM DW 0DSEG ENDSCSEG SEGMENT ASSUME CS:CSEG,DS:DSEGMAIN: MOV AX,DSEG MOV DS,AX LEA SI,DATA ;设置地址指针 MOV CX,COUNT ;计数值送CX XOR AX,AX ;AX清零 XOR BX,BX ;清存和寄存器 XOR DX,DXAGAIN: MOV AL,[SI] ;取数据 TEST AL,01 ;测试最低位 JZ EVENS ;偶数,转 ADD BX,AX ;奇数,累计和 JMP CHCNTEVENS: ADD DX,AX ;偶数,累计和CHCNT: INC SI ;指向下个数据 LOOP AGAIN ;计算完?未完继续 MOV ODDSUM,BX ;保存结果 MOV EVENSUM,DX MOV AH,4CH INT 21HCSEG ENDS END MAIN思考题:测试最低位状态也可以用右移指令,然后判断CF的状态。请问如何修改程序语句?扩展题:有一个班级,学生人数存储于内存NUB单元,该班同学某门课程的成绩存放于内存S开始的单元,编制程序,统计该班该课程的平均成绩,存放于E单元。[程序2]试编制一程序。从键盘输入一个字符,若为“1”,则显示“THEFIRSTSUBROUTINE!”;否则显示“INPUTTHERIGHTCHARACTER”,返回DOS。本例用了三个非常常用的DOS系统功能调用。其中第一个调用实现一个字符串的输出显示,调用前,应将DX指向存放要显示字符串的缓冲区的首地址,被显示的字符串应以‘$’结尾。第二个调用,实现从键盘输入一个字符,调用后,字符的ASCII码在AL寄存器中。第三个调用为在屏幕上显示一个字符,调用前,被显示字符的ASCII码应送入DL寄存器中。有关DOS系统调用的详细资料参见附录。整个程序的清单如下:DATA SEGMENTSTR0 DB ‘INPUTTHERIGHTCHARACTER’,’$’STR1 DB ‘INPUTCHARACTER:$’STR2 DB ‘THEFIRSTSUBROUTINE!$’DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX MOV DX,OFFSETSTR1 ;提示输入字符 MOV AH,09H INT 21H MOV AH,01H ;接收键入字符 INT 21H CMP AL,’1’ JZ SUBF ;是1,转入SUBF MOV DL,0DH MOV AH,02H INT 21H MOV DL,0AH MOV AH,02H INT 21H LEA DX,STR0 ;非1,提示字符输入形式 MOV AH,09H INT 21H JMP EXITSUBF: LEA DX,STR2 MOV AH,09H INT 21H JMP EXITEXIT: MOV AH,4CH ;程序结束退出 INT 21HCODE ENDS END START思考题:请仔细阅读程序说明AH功能号分别为01H,02H,09H时所代表的功能。扩展题:编写程序在屏幕上显示A~Z26个大写字母,要求用DOS系统功能调用INT21H的02H号功能实现。[程序3]计算一组字数据中正数、负数和零的个数,并分别存放在PCOUNT,MCOUNT和ZCOUNT单元。设该组数据首地址为ARRY,数据个数在CNT单元存放。主程序清单如下:DSEG SEGMENTARRY DW 15,-5,1,5,0,123,964,-327,0CNT DW 9PCOUNT DW 0MCOUNT DW 0ZCOUNT DW 0DSEG ENDSCSEG SEGMENT ASSUME CS:CSEG,DS:DSEGSTART: MOV AX,DSEG MOV DS,AX LEA SI,ARRY ;取数据首址到SI MOV CX,CNT ;取数组数据个数到CX XOR AX,AX ;清计数器 XOR BX,BX XOR DX,DXPMZN0: TEST WORDPTR[SI],0FFFFH ;测试数据 JS MINUS ;负转 JNZ PLUS ;非0转 INC DX ;为0,0计数器加1 JMP PMZN1PLUS: INC AX ;正数计数器加1 JMP PMZN1MINUS: INC BX ;负数计数器加1PMZN1: INC SI ;指向下一个数据 LOOP PMZN0 MOV PCOUNT,AX ;保存结果 MOV MCOUNT,BX MOV ZCOUNT,DX MOV AH,4CH INT 21HCSEG ENDS END START思考题:本程序利用TEST指令影响标志位来判别程

温馨提示

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

评论

0/150

提交评论