欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    微机原理第三章.doc

    • 资源ID:60073290       资源大小:2.19MB        全文页数:72页
    • 资源格式: DOC        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    微机原理第三章.doc

    可用除法运算将二进制数转换为BCD数。如把AL中的8位无符号二进制数转换为BCD数放入AX中的程序段如下: MOV CL,10 MOV AH,0 ;8位二进制数扩展为16位二进制数 DIV CL MOV CH,AH ;暂存BCD数个位 MOV AH,0 DIV CL MOV CL,4 SHL AH,CL ;BCD数十位移至高4位 OR CH,AH ;BCD数十位与个位拼合 MOV AH,0 MOV CL,10 DIV CL ;AH中的余数为BCD数百位 MOV AL,CH ;BCD数十位与个位送AL用除10取余法将8位二进制数FFH转换为BCD数255H的二进制运算如图3-3所示。 图3-3 8位二进制数FFH转换为BCD数255H的二进制运算除法指令对所有的状态标志位均无定义。3.扩展指令CBW(convert byte to word)和CWD(convert word to double word)从除法指令的操作可知,要把一个8位二进制数除以一个8位二进制数,要有一个16位二进制数在AX中,只是把一个8位的被除数放入AL中是不行的,因为除法指令将把任何在AH中的数当作被除数的高8位。所以在做8位除以8位的除法之前先要把8位被除数扩展为16位,在做16位除以16位的除法之前要把16位被除数扩展为32位,才能保证除法指令的正确操作。这种扩展对于无符号数除法是很容易办到的,只需将AH或DX清0即可。对符号整数除法就不能用将被除数的高半部清0来实现,而要通过扩展符号位来把被除数扩展。例如把2的8位形式1111 1110转换为16位形式1111 1111 1111 1110,即要把高半部全部置1(2的符号位);而把+3的8位形式0000 0011转换成16位形式0000 0000 0000 0011,却要把高半部全部置0(+3的符号位)。指令格式 CBWCWD将字节扩展为字指令CBW所执行的操作是把AL的最高位扩展到AH的所有位。将字扩展为双字指令CWD把AX的最高位扩展到DX的所有位。在做8位除以8位和16位除以16位的除法之前,应先扩展AL或AX中的被除数。例如,在数据段中,有一符号字数组变量ARRAY,第1个字是被除数,第2个字是除数,接着存放商和余数,其程序段是: MOV SI,OFFSET ARRAY MOV AX,SI CWD IDIV WORD PTR 2SI MOV 4SI,AX MOV 6SI,DX一般情况下,都将符号数看作补码数,扩展指令和符号整数除法仅对补码数适用。若特别指出该符号数为原码数,则其扩展和除法运算都要另编程序段实现。3.1.2 BCD数调整指令第2.3节介绍的加减指令和本节介绍的乘除指令都是对二进制数进行操作。二进制数算术运算指令对BCD数进行运算,会得到一个非BCD数或不正确的BCD数。如: 0000 0011B+0000 1001B= 0000 1100B 0000 1001B+0000 0111B= 0001 0000B第一个结果是非BCD数;第二个结果是不正确的BCD数。其原因是BCD数向高位的进位是逢10进1,而4位二进制数向高位进位是逢16进1,中间相差6。若再加上6,就可以得到正确的BCD数: 0000 1100B+0000 0110B= 0001 0010B 0001 0000B+0000 0110B= 0001 0110B8086/8088对BCD数使用二进制数算术运算指令进行运算,然后执行一条能把结果转换成正确的BCD数的专用调整指令来处理BCD数的结果。1.BCD数加法调整指令DAA(decimal adjust for add)和AAA(ASCII adjust for add)指令格式 DAA AAADAA 指令的意义是将AL中的数当作两个压缩BCD数相加之和来进行调整,得到两位压缩BCD数。具体操作是,若(AL & 0FH) >9或AF=1,则AL加上6;若(AL & 0F0H) >90H或CF=1,则AL加60H。如: MOV AX,3456H ADD AL,AH ;AL=8AH DAA ;AL=90HAAA指令的意义是将AL中的数当作两个非压缩BCD数相加之和进行调整,得到正确的非压缩BCD数送AX。具体操作是,若(AL&0FH) >9或AF=1,则(AL+6)& 0FH送AL,AH加1;否则AL & 0FH送AL,AH不变。应特别注意,AAA指令执行前AH的值。如: MOV AX,0806H ADD AL,AH ;AX=080EH MOV AH,0 AAA ;AX=0104H又如:若要将两个BCD数的ASCII码相加,得到和的ASCII码,可以直接用ASCII码相加,加后再调整: MOV AL,35H ;5 ADD AL,39H ;9,AL=6EH MOV AH,0 AAA ;AX=0104H OR AX,3030H ;AX=3134H即34由调整指令所执行的具体操作可以看到,对结果进行调整时要用到进位标志和辅助进位标志,所以调整指令应紧跟在BCD数作为加数的加法指令之后。所谓“紧跟”是指在调整指令与加法指令之间不得有改变标志位的指令。2.BCD数减法调整指令 DAS(decimal adjust for subtract)和AAS(ASCII adjust for subtract)指令格式 DAS AASDAS指令的功能是将AL中的数当作两个压缩BCD数相减之差来进行调整,得到正确的压缩BCD数。具体操作是:若(AL & 0FH) >9或AF=1,则AL减6,(AL & 0F0H) >90H或CF=1,则AL减60H。如: MOV AX, 5634H SUB AL,AH ;AL=DEH,有借位 DAS ;AL=78H,保持借位即134-56AAS指令的功能是将AL中的数当作两个非压缩BCD数相减之差进行调整得到正确的非压缩BCD数。具体操作是:若(AL & 0FH) >9或AF=1,则(AL-6) & 0FH送AL,AH减1;否则AL & 0FH送AL,AH不变。应特别注意,AAS指令执行前AH的值。如: MOV AX,0806H SUB AL,07H ;AX=08FFH AAS ;AX=0709H3.非压缩BCD数乘除法调整指令 AAM( ASCII adjust for multiply)和AAD(ASCII adjust for divide)压缩BCD数对乘除法的结果不能进行调整,故只有非压缩BCD数乘除法调整指令。指令格式 AAM AADAAM指令的功能是将AL中的小于64H的二进制数进行调整,在AX中得到正确的非压缩BCD数。具体操作是AL/0AH送AH,AL MOD 0AH 送AL。如: MOV AL,63H AAM ;AX=0909HAAD指令的功能是将AX中的两位非压缩BCD数变换为二进制数。在做二位非压缩BCD数除以一位非压缩BCD数时,先将AX中的被除数调整为二进制数,然后用二进制除法指令DIV相除,保存AH中的余数后,再用AAM指令把商变回为非压缩的BCD数。如: MOV AX,0906H MOV DL,06H AAD ;AX=0060H DIV DL ;AL=10H、AH=0 MOV DL,AH ;存余数 AAM ;AX=0106H应注意的是,除法的调整不同于加法、减法和乘法,它们的调整是在相应运算操作之后进行,而除法的调整在除法操作之前进行。调整指令都隐含着AX或AL,都在AX或AL中进行。下面举几个使用调整指令的例子。例3.1已知字变量W1和W2分别存放着两个压缩BCD数,编写求两数之和,并将其和送到 SUM 字节变量中的程序。此例应注意以下两个问题:(1)定义字变量W1和W2的4位数应为BCD数,其后要加H,只有这样定义装入内存中的数据才是4位BCD数。(2)BCD数的加减运算只能做字节运算,不能做字运算。这是因为加减指令把操作数都当作二进制数进行运算,运算之后再用调整指令进行调整,而调整指令只对AL作为目的操作数的加减运算进行调整。程序如下:stack segment stack ¢stack¢ dw 32 dup(?) stack ends data segment W1 DW 8931H W2 DW 5678H SUM DB 3 DUP(?) data ends code segment begin proc far assume ss:stack,cs:code,ds:data push ds sub ax,ax push ax mov ax,data mov ds,ax MOV AL, BYTE PTR W1;AL=31H ADD AL, BYTE PTR W2;AL=A9H, CF=0, AF=0DAA ;AL=09H, CF=1MOV SUM, ALMOV AL, BYTE PTR W1+1;AL=89HADC AL, BYTE PTR W2+1;AL=E0H,CF=0,AF=1 DAA ;AL=46H, CF=1MOV SUM+1, ALMOV SUM+2, 0 ;处理向万位的进位RCL SUM+2, 1;也可用指令ADC SUM+2, 0 ret begin endp code ends end begin例3.2已知字变量W1和W2分别存放着两个非压缩BCD数,编写求两数之和,并将其和送到 SUM 字节变量中的程序。定义字变量W1和W2的数应为两位非压缩BCD数,其后要加H。程序如下:stack segment stack ¢stack¢ dw 32 dup(?) stack ends data segment W1 DW 0809H W2 DW 0607H SUM DB 3 DUP(?) data ends code segment begin proc far assume ss:stack,cs:code,ds:data push ds sub ax,ax push ax mov ax,data mov ds,ax MOV AL, BYTE PTR W1;AL=09H ADD AL, BYTE PTR W2;AL=10H, AF=1 MOV AH,0AAA ;AL=06H, AH=01HMOV SUM, ALMOV AL,AHADD AL, BYTE PTR W1+1;AL=09HADD AL, BYTE PTR W2+1; AL=0FH, AF=0MOV AH,0AAA ; AL=05H, AH=01HMOV WORD PTR SUM+1, AX ret begin endp code ends end begin 03 07× 09 06 03 02 07 02 0D 033FH1BH03 03 03AAMAAMAAA例3.3字变量W和字节变量B分别存放着两个非压缩BCD数,编写求两数之积,(如0307H和09H)并将它存储到JJ字节变量中的程序。 stack segment stack ¢stack¢ dw 32 dup(?) stack ends data segment W DW 0307H B DB 9 JJ DB 3 DUP(?) data ends code segment begin proc far assume ss:stack,cs:code,ds:data push ds sub ax,ax push ax mov ax,data mov ds,ax MOV AL, BYTE PTR W ;AL=07H MUL B ;AX=003FHAAM ;AX=0603HMOV WORD PTR JJ, AXMOV AL, BYTE PTR W+1;AL=03HMUL B ;AX=001BHAAM ;AX=0207HADD AL, JJ+1;07H+06H=0DH, 即AL=0DHAAA ;调整后的进位,直接加入AH!AX=0303H MOV WORD PTR JJ+1,AX ret begin endp code ends end begin例3.4字变量W和字节变量B中分别存放着两个非压缩BCD数,编制程序求二者的商和余数,并分别存放到字变量QUOT和字节变量REMA中。定义字变量W的数应为两位非压缩BCD数,其后要加H。由于是BCD数的除法,所以要先调整,因此先将W中的非压缩BCD数取到AX中,然后将AX中的非压缩BCD数调整为二进制数。二进制数的除法之后,又应用AAM指令将结果调整为非压缩BCD数。AAM指令是将AL中的小于100的二进制数调整为非压缩BCD数,存入AX中,因此,调整前应将除法产生的余数存入REMA中。 stack segment stack ¢stack¢ dw 32 dup(?) stack ends data segment W DW 0909H B DB 5 REMA DB ? QUOT DW ? data ends code segment begin proc far assume ss:stack,cs:code,ds:data push ds sub ax,ax push ax mov ax,data mov ds,axMOV AX,W AAD;0909H®63HDIV B;63H¸5=13H4, AL=13H, AH=04HMOV REMA, AHAAM;13H®0109H MOV QUOT,AX ret begin endp code ends end begin3.1.3顺序程序设计举例例3.5编程计算(W1(W2×W3W45000)/W5W6。式中Wi (i=16)均为符号字变量。 stack segment stack ¢stack¢ dw 32 dup(?) stack ends data segment W1 DW 15000 W2 DW 500 W3 DW 800 W4 DW 30000 W5 DW 4000 W6 DW 2 DUP(?) data ends code segment start proc far assume ss:stack,cs:code,ds:data push ds sub ax,ax push ax mov ax,data mov ds,ax MOV AX,W2 IMUL W3 MOV BX,AX MOV CX,DX MOV AX,W4 CWD ADD BX,AX ADC CX,DX SUB BX,5000 SBB CX,0 MOV AX,W1 CWD SUB AX,BX SBB DX,CX IDIV W5 MOV W6,AX MOV W6+2,DX ret start endp code ends end start例3.6从键盘上键入09中任一自然数N,将其立方值送显示器显示。求一个数的立方值可以用乘法运算实现,也可以用查表法实现。查表法运算速度比较快,是常用的计算方法。因只要送显示,故将09的立方值的ASCII码按顺序造一立方表。立方值最大值为729,需三个单元存放它的ASCII码,表的每项的单元数相同,再在每项之后加一个$,所以立方表的每项均占4个字节。根据这种存放规律可推知,表的偏移首地址与自然数N的4倍之和,正是N的立方值和$的ASCII码的存放单元的偏移首地址。程序如下: stack segment stack ¢stack¢ dw 32 dup(?) stack ends data segment INPUT DB ¢PLEASE INPUT N(0-9):$¢ LFB DB ¢ 0$ 1$ 8$ 27$ 64$125$216$343$512$729$ N DB? data ends code segment start proc far assume ss:stack,cs:code,ds:data push ds sub ax,ax push ax mov ax,data mov ds,ax MOV DX,OFFSET INPUT;显示提示信息 MOV AH,9 INT 21H MOV AH,1 ;键入并回显N(1号功能调) INT 21H MOV N,AL MOV AH,2 ;换行(2号功能调用) MOV DL,0AH INT 21H MOV DL,N MOV DL,0FH ;将¢ N¢转换为N MOV CL,2 ;将N乘以4 SHL DL,CL MOV DH,0 ;8位4N扩展为16位 ADD DX,OFFSET LFB ;4N+表的偏移地址 MOV AH,9 INT 21H ret start endp code ends end start例3.7两个32位无符号数的乘法程序。8086/8088只有16位运算指令,所以该问题无法直接用乘法指令实现,但可以用16位乘法指令做四次乘法,然后把部分积相加,如图3-4所示,相应的程序如下。图3-4 32位无符号数的乘法 stack segment stack ¢stack¢ dw 32 dup (?) stack ends data segment AB DD H CD DD H ABCD DD 2 DUP(?) data ends code segment start proc far assume ss:stack,cs:code,ds:data push ds sub ax,ax push ax mov ax,data mov ds,ax MOV BX,OFFSET ABMOV AX, BX+4 ;d®AX,AX=3445H MUL WORD PTR BX ;d´b MOV BX+8, AX ;存db的低16位 MOV BX+10, DX ;存db的高16位 MOV AX, BX+4 ;d®AX; AX=3445H MUL WORD PTR BX+2 ;d´a ADD BX+10, AX ;d´a的低16位加上d´b的高16位 ADC DX, 0 ;上述加法若有进位,则加入d´a的高16位中 MOV BX+12, DX ;存d´a的高16位 MOV AX, BX+6 ;c®AX; AX=1223H MUL WORD PTR BX ;c´b ADD BX+10, AX ;c´b的低16位加入 ADC BX+12, DX ;c´b的高16位加入存放单元 MOV BYTE PTR BX+14, 0;清0a´c的高16位的存放单元 ADC BYTE PTR BX+14, 0;c´b的高16位加入时产生的进位存入 MOV AX, BX+6 ;c®AX; AX=1223H MUL WORD PTR BX+2 ;a´c ADD BX+12, AX ;a´c的低16位加入 ADC BX+14, DX ;a´c的高16位加入 ret start endp code ends end start3.2 分支程序设计顺序程序的特点是从程序的第一条指令开始,按顺序执行,直到最后一条指令。然而,许多实际问题并不能设计成顺序程序,需要根据不同的条件作出不同的处理。把不同的处理方法编制成各自的处理程序段,运行时由机器根据不同的条件自动作出选择判别,绕过某些指令,仅执行相应的处理程序段。按这种方式编制的程序,执行的顺序与指令存储的顺序失去了完全的一致性,称之为分支程序。分支程序是机器利用改变标志位的指令和转移指令来实现的。转移指令有JMP和Jcond两类。前者是无条件转移,后者是条件转移。JMP指令将控制转向其后的目的标号指定的地址。条件转移指令伴随着能改变可测试条件标志的指令之后,根据设置条件决定是否将控制转向其后的目的地址。3.2.1条件转移指令指令格式 Jcond short-lable该指令的功能是,若条件满足则short-lable的偏移地址送IP,否则顺序执行。条件转移指令是相对转移指令,都是两字节的指令。相对转移指令的转移范围,即从当前地址(执行该指令时的IP值)到目的标号地址的偏移量为128127(从条件转移指令的地址到目的标号的地址则为126129),故条件转移指令只能实现段内转移。1.简单的条件转移指令简单的条件转移指令是仅根据一个可测试标志位实现转移的指令。简单的条件转移指令如表3-1所列。表3-1简单的条件转移指令指令助记符功能标志设置JE/JZ相等/等于0转移ZF=1JNE/JNZ不相等/不等于0转移ZF=0JC有进(借)位转移CF=1JNC无进(借)位转移CF=0JS为负转移SF=1JNS为正转移SF=0JO溢出转移OF=1JNO无溢出转移OF=0JP/JPE偶转移 PF=1JNP/JPO奇转移PF=02.无符号数条件转移指令条件转移指令常根据比较指令比较两个数的关系的结果来实现转移。两个数的关系除了相等与否外,还有两个数中哪一个比较大。但这就有一个有趣的问题,如8位二进制数大于吗? 答案既可肯定又可否定。因为若视这两个二进制数为无符号数, 当然大于;若视这两个二进制数为符号数(补码),为1,就比0小了。为此要使用两种术语来区分无符号数和符号数的这种关系。如果把数作为符号数来比较,就使用术语“小于”和“大于”;如果把数作为无符号数来比较,就使用术语“低于”和“高于”。因此8位二进制数高于,小于,而既高于又大于。所以8086/8088设置了符号数的条件转移指令和无符号数的条件转移指令。无符号数条件转移指令有4条,如表3-2所列。表3-2 无符号数条件转移指令指令助记符功能JB/JNAE低于/不高于等于转移JNB/JAE不低于/高于等于转移JA/JNBE高于/不低于等于转移JNA/JBE不高于/低于等于转移已知AL中有一十六进制数的ASCII码,将它转换为十六进制数需判别该ASCII码是09的ASCII码还是AF的ASCII码,可以用无符号数条件转移指令来判别,其程序段为: CMP AL,¢A¢ JB NS7 ;AL低于A的ASCII码去NS7 SUB AL,7NS7: SUB AL,30H 也可以用简单的条件转移指令JC NS7代替无符号数条件转移指令。因为AL低于A的ASCII码,AL与A比较(即相减)后有借位。3. 符号数条件转移指令符号数条件转移指令有4条,如表3-3所列。 表3-3 符号数条件转移指令指令助记符功能JL/JNGE小于/不大于等于转移JNL/JGE不小于/大于等于转移JG/JNLE大于/不小于等于转移JNG/JLE不大于/小于等于转移3.2.2 无条件转移指令条件转移指令的转移范围为-128127,若超过这个范围时,就要在这个范围的某处放一条无条件转移指令来实现转移。无条件转移指令没有范围限制。在分支程序中还要用无条件转移指令将各分支又重新汇集到一起。无条件转移指令有直接转移和间接转移两类。1.无条件直接转移指令格式 JMP target功能 将控制转向目的标号target,即target的偏移地址送IP,target的段首址送CS(若target与该指令在同一段,则无此操作,只改变IP)。2.无条件间接转移指令格式 JMP dest目的操作数可为寄存器和存储器。若为寄存器,则是将寄存器的内容送IP。存储器操作数若为字变量,则是将字变量送IP(仅能实现段内转移);若为双字变量,则是将双字送CS和IP(可实现段间转移)。如:JMP W(W为字变量)的操作是将W的内容送IP;JMP DUW(DUW 为双字变量)的操作是将WORD PTR DUW的内容送IP、WORD PTR DUW+2的内容送CS。又如:JMP WORD PTR BX的操作是将BX+1和BX送IP;JMP DWORD PTR BX的操作是将BX+1和

    注意事项

    本文(微机原理第三章.doc)为本站会员(飞****2)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开