汇编语言程序设计8255A中,JN非零转移报错,超出范围,怎么改

钱晓捷新版汇编语言程序设计习题答案(修改)_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
钱晓捷新版汇编语言程序设计习题答案(修改)
上传于||暂无简介
阅读已结束,如果下载本文需要使用2下载券
想免费下载本文?
下载文档到电脑,查找使用更方便
还剩64页未读,继续阅读
你可能喜欢君,已阅读到文档的结尾了呢~~
汇编语言课后习题及答案
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
汇编语言课后习题及答案
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
汇编习题答案(1)
下载积分:0
内容提示:汇编习题答案(1)
文档格式:DOC|
浏览次数:42|
上传日期: 21:19:25|
文档星级:
该用户还上传了这些文档
汇编习题答案(1)
官方公共微信10879人阅读
PC汇编(5)
&〔习题2.6〕给出下列各条指令执行后AL值,以及CF、ZF、SF、OF和PF的状态:
&&&&&&&&&& mov al,89h
&&&&&&&&&& add al,al
&&&&&&&&&& add al,9dh
&&&&&&&&&& cmp al,0bch
&&&&&&&&&& sub al,al
&&&&&&&&&& dec al
&&&&&&&&&& inc al
mov al,89h&&&&&&&&&& ; AL=89h&& CF& ZF& SF& OF& PF
add al,al&&&&&&&&&&&& & ; AL=12h&& 1&& 0&& 0&& 1&& 1
add al,9dh&&&&&&&&&&& & ; AL=0afh& 0&& 0&& 1&& 0&& 1
cmp al,0bch&&&&&&&&& ; AL=0afh& 1&& 0&& 1&& 0&& 1
sub al,al&&&&&&&&&&&&& &; AL=00h&& 0&& 1&& 0&& 0&& 1
dec al&&&&&&&&&&&&&&&& & ; AL=0ffh& 0&& 0&& 1&& 0&& 1
inc al&&&&&&&&&&&&&&&&&&& ; AL=00h&& 0&& 1&& 0&& 0&& 1
&〔习题2.7〕设X、Y、Z均为双字数据,分别存放在地址为X、X+2;Y、Y+2;Z、Z+2的存储单元中,它们的运算结果存入W单元。阅读如下程序段,给出运算公式。
&&&&&&&&&& mov ax,X
&&&&&&&&&& mov dx,X+2
&&&&&&&&&& add ax,Y
&&&&&&&&&& adc dx,Y+2
&&&&&&&&&& add ax,24
&&&&&&&&&& adc dx,0
&&&&&&&&&& sub ax,Z
&&&&&&&&&& sbb dx,Z+2
&&&&&&&&&& mov W,ax
&&&&&&&&&&&mov W+2,dx
&&&&&&& W=X+Y+24-Z
〔习题2.8〕请分别用一条汇编语言指令完成如下功能:
(1)把BX寄存器和DX寄存器的内容相加,结果存入DX寄存器。
(2)用寄存器BX和SI的基址变址寻址方式把存储器的一个字节与AL寄存器的内容相加,并把结果送到AL中。
(3)用BX和位移量0B2H的寄存器相对寻址方式把存储器中的一个字和CX寄存器的内容相加,并把结果送回存储器中。
(4)用位移量为0520H的直接寻址方式把存储器中的一个字与数3412H相加,并把结果送回该存储单元中。
(5)把数0A0H与AL寄存器的内容相加,并把结果送回AL中。
(1)ADD DX,BX
(2)ADD AL,[BX+SI]
(3)ADD [BX+0B2H],CX
(4)ADD WORD PTR [0520H],3412H
(5)ADD AL,0A0H
〔习题2.9〕设X、Y、Z、V均为16位带符号数,分别装在X、Y、Z、V存储单元中,阅读如下程序段,得出它的运算公式,并说明运算结果存于何处。
&&&&&&&&&& mov ax,X&&&& ;ax=X
&&&&&&&&&& imul Y&&&&&& ;DX.AX=X*Y
&&&&&&&&&& mov cx,ax&&& ;cx=X*Y的低16位
&&&&&&&&&& mox bx,dx&&& ;bx=X*Y的高16位
&&&&&&&&&& mov ax,Z&&&& &;ax=Z
&&&&&&&&&& cwd
&&&&&&&&&& add cx,ax&&& ;cx=Z的低16位+X*Y的低16位
&&&&&&&&&& adc bx,dx&& &;bx=Z的高16位+X*Y的高16位+低位进位
&&&&&&&&&& sub cx,540&& ;cx=Z的低16位+X*Y的低16位-540
&&&&&&&&&& sbb bx,0&&&&& &;bx=Z的高16位+X*Y的高16位+低位进位-低位借位
&&&&&&&&&& mov ax,V&&& & ;ax=V
&&&&&&&&&& cwd
&&&&&&&&&& sub ax,cx&&& &;ax=V的低16位-(Z的低16位+X*Y的低16位-540)
&&&&&&&&& sbb dx,bx&&& &;dx=V的高16位-(Z的高16位+X*Y的高16位+低位进位-低位借位)-低位借位
&&&&&&&&& idiv X ;/X
&&&&&& [V-(X*Y+Z-540)]/X
&&&&&& AX存商,DX存余数
〔习题2.10〕指出下列指令的错误:
(1) xchg [si],30h
(2) pop cs
(3) sub [si],[di]
(4) push ah
(5) adc ax,ds
(6) add [si],80h
(7) in al,3fch
(8) out dx,ah
(1)xchg的操作数不能是立即数
(2)不应对CS直接赋值
(3)两个操作数不能都是存储单元
(4)堆栈的操作数不能是字节量
(5)adc的操作数不能是段寄存器
(6)没有确定是字节还是字操作
(7)in不支持超过FFH的直接寻址
(8)out只能以AL/AX为源操作数
〔习题2.11〕给出下列各条指令执行后的结果,以及状态标志CF、OF、SF、ZF、PF的状态。
&&&&&&&&&& mov ax,1470h
&&&&&&&&&& and ax,ax
&&&&&&&&&& or ax,ax
&&&&&&&&&& xor ax,ax
&&&&&&&&&& not ax
&&&&&&&&&& test ax,0f0f0h
〔解答〕&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&& mov ax,1470h&&&&&&&&& ;AX=1470H CF& ZF& SF& OF& PF
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&& and ax,ax&&&&&&&&&&&&&& & ;AX=1470H 0&& 0&& 0&& 0&& 0
&&&&&&&&&&& ;11 0000
&&&&&&&&&& or ax,ax&&&&&&&&&&&&&&&& & ;AX=1470H 0&& 0&& 0&& 0&& 0
&&&&&&&&&& xor ax,ax&&&&&&&&&&&& &&& ;AX=0000H 0&& 1&& 0&& 0&& 1
&&&&&&&&&& not ax&&&&&&&&&&&&&&&&&&& & ;AX=FFFFH 0&& 1&& 0&& 0&& 1
&&&&&&&&&& test ax,0f0f0h&&&&& && ;AX=FFFFH 0&& 0&& 1&& 0&& 1
注意:MOV和NOT指令不影响标志位;其他逻辑指令使CF=OF=0,根据结果影响其他标志位。
〔习题2.12〕假设例题2.32的程序段中,AX = 08H,BX = 10H,请说明每条指令执行后的结果和各个标志位的状态。
&&&&&&&&&& 指令&&&&&&&&&&&& &; 执行结果&&&&&&&&&&&&&&&&& & &CF OF SF ZF PF
&&&&&&&&&& mov si,ax&&& ; SI=AX=0008H&&&&&&&&&&&&&&& -&&& &-&&&&& -&& -&&&& -
&&&&&&&&&& shl si,1&&&&& & ; SI=2*AX=0010H&&&&&&&&&&&&&0&& &0&& &0&& &0&&& 0
&&&&&&&&&& add si,ax&&&& ; SI=3*AX=0018H&&&&&&&&&&&& 0& & 0&& &0&& &0&& &1
&&&&&&&&&& mov dx,bx&&&; DX=BX=0010H&&&&&&&&&&&&& 0& & 0&&& 0&& &0&&& 1
&&&&&&&&&& mov cl,03h&&; CL=03H&&&&&&&&&&&&&&&&&&&&&&&&&0&& &0&& &0&&& 0&&& 1
&&&&&&&&&& shl dx,cl&&&& & ; DX=8*BX=0080H&&&&&&&&& 0&& &u&&& 0&&& 0& & 0
&&&&&&&&&& sub dx,bx&&& ; DX=7*BX=0070H&&&&&&&&&& 0&& &0& & 0&& &0&& &0
&&&&&&&&&& add dx,si&&&&&; DX=7*BX+3*AX=0088H&&0&&& 0&&& 0&& &0&&& 1
注意:逻辑左移N次相当于无符号整数乘以2的N次方,逻辑右移N次相当于无符号整数除以2的N次方。移位指令根据移位的数据设置CF,根据移位后的结果影响SF,ZF,PF。在进行一位移位时,根据最高符号位是否改变设置OF,如改变则OF=1。另外,程序注释用&u&表示标志无定义(不确定),&-&表示无影响。
〔习题2.13〕编写程序段完成如下要求:
(1)用位操作指令实现AL(无符号数)乘以10
(2)用逻辑运算指令实现数字0 ~ 9的ASCII码与非压缩BCD码的互相转换
(3)把DX.AX中的双字右移4位
(1)&;不考虑进位&&&&&&&&
&&&&&&&&& mov bl,al
&&&&&&&&&& mov cl,3
&&&&&&&&&& shl al,cl&&&&&&&&&&&&&& ;*8
&&&&&&&&&& add al,bl&&&&&&&&&&&& ;shl bl,1&
&&&&&&&&&& add al,bl
&&&&&&&&&& ;考虑进位
&&&&&&&&&& xor ah,ah
&&&&&&&&&& mov bx,ax
&&&&&&&&&& mov cl,3
&&&&&&&&&& shl ax,cl
&&&&&&&&&& add ax,bx&&&&&&&&&&&& ;shl bx,1
&&&&&&&&&& add ax,bx
(2)数字0~9的ASCII码是:30h~39h
&&&&&&& 非压缩BCD码的0~9是:00h~09h
&&&&&&&&&& and al,0fh&&&&&&&&&&& ;实现ASCII到非压缩BCD码的转换
&&&&&&&&&& or al,30h&&&&&&&&&&&& ;实现非压缩BCD码到ASCII的转换
&&&&&&&&&& xor al,30h&&&&&&&&&&& ;求反D5D4位,其他不变
&&&&&&&&&& ;即高4位为3,则变为0;高4位为0,则变为3
(3)&& mov cl,4
again:&&shr dx,1&&&&&&&&&&&&& ;实现逻辑右移
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &;采用&sar dx,1&,则实现算术右移
&&&&&&&&&&& &rcr ax,1
&&&&&&&&&&&&&dec cl
&&&&&&&&& && jnz again
〔习题2.14〕已知AL = F7H(表示有符号数-9),分别编写用SAR和IDIV指令实现的除以2的程序段,并说明各自执行后,所得的商是什么?
(1)用sar编写
&&&&&&&&&& mov al,0f7h&&&&&&&&&& ; -9送AL
&&&&&&&&&& sar al,1&&&&&&&&&&&&& ; 结果:AL=B=0FBH& 即-5
(2)用idiv编写
&&&&&&&&&& mov al,0f7h&&&&&&&&&& ; -9送al
&&&&&&&&&& cbw&&&&&&&&&&&&&&&&&& ; 字节符号扩展位字
&&&&&&&&&& mov bl,2&&&&&&&&&&&&& ; 注意除数不可为立即数
&&&&&&&&&& idiv bl&&&&&&&&&&&&&& ; 结果:商为al=fch& (-4)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ; 余数:ah=ffh (-1)
结论:符号数的除法用idiv 准确。
&〔习题2.15〕已知数据段500h ~600h处存放了一个字符串,说明下列程序段执行后的结果:
&&&&&&&&&& mov si,600h
&&&&&&&&&& mov di,601h
&&&&&&&&&& mov ax,ds
&&&&&&&&&& mov es,ax
&&&&&&&&&& mov cx,256
&&&&&&&&&& std
&&&&&&&&&& rep movsb
&〔习题2.16〕说明下列程序段的功能
&&&&&&&&&& cld
&&&&&&&&&& mov ax,0fefh
&&&&&&&&&& mov cx,5
&&&&&&&&&& mov bx,3000h
&&&&&&&&&& mov es,bx
&&&&&&&&&& mov di,2000h
&&&&&&&&&& rep stosw
&将es:di (即h或32000h)开始的5个单元的内容置为0fefh。
〔习题2.17〕指令指针IP是通用寄存器还是专用寄存器?有指令能够直接它赋值吗?哪类指令的执行会改变它的值?
指令指针IP不是通用寄存器,不可直接赋值,属于专用寄存器。有且仅有循环、转移、子程序调用和返回、中断类等指令可以改变它的值。
〔习题2.18〕控制转移类指令中有哪三种寻址方式?
控制转移类指令的寻址方式:相对寻址、直接寻址方式和间接寻址方式(又可以分成寄存器和存储器间接寻址)。
〔习题2.19〕什么是短转移short jump、近转移near jump和远转移far jump?什么是段内转移和段间转移?8086有哪些指令可以实现段间转移?
短转移:指段内-128~127之间的转移,位移量用一个字节表示
近转移:指段内&32K之间的转移,位移量用一个字表示
远转移:指段间1MB范围的转移
段内转移:指在同一个代码段内的转移,可以是短转移或者近转移
段间转移:指转移到另外一个代码段,就是远转移
CPU的JMP、CALL和INT n指令可以实现段间转移
〔习题2.20〕8086的条件转移指令的转移范围有多大?实际编程时,你如何处理超出范围的条件转移?
8086的条件转移的转移范围:在当前指令地址的 +127~-128之内。
如条件转移的转移范围超出此范围,可在此范围内安排一条无条件转移,再转移到范围外的目标地址。
〔习题2.21〕假设DS=2000H,BX=1256H,SI=528FH,位移量TABLE=20A1H,[232F7H]=3280H,[264E5H]=2450H,试问执行下列段内间接寻址的转移指令后,转移的有效地址是什么?
(1) JMP BX
(2) JMP TABLE[BX]
(3) JMP [BX][SI]
(1)转移的有效地址EA= BX=1256H
(2)转移的有效地址EA= [DS:20A1H+1256H]=[232F7]=3280H
(3)转移的有效地址EA= [DS:FH]=264E5H=2450H
〔习题2.22〕判断下列程序段跳转的条件
&&&&&&&&&& (1) xor ax,1e1eh
&&&&&&&&&& &&&&&&&&&& &je equal
&&&&&&&&&& (2)test al,b
&&&&&&&&&& &&&&&&&& &jnz there
&&&&&&&&&& (3)cmp cx,64h
&&&&&&&&&&&&&&&&&&&& jb there
(1)AX=1e1eh(异或后为0)
(2)AL的D0或D7至少有一位为1
(3)CX(无符号数)< 64h
〔习题2.23〕设置CX = 0,则LOOP指令将循环多少次?例如:
&&&&&&&&&&&&&mov cx,0
delay:&&&loop delay
&& 216次。
〔习题2.24〕假设AX和SI存放的是有符号数,DX和DI存放的是无符号数,请用比较指令和条件转移指令实现以下判断:
(1)若DX & DI,转到above执行;
(2)若AX & SI,转到greater执行;
(3)若CX = 0,转到zero执行;
(4)若AX-SI产生溢出,转到overflow执行;
(5)若SI&AX,转到less_eq执行;
(6)若DI&DX,转到below_eq执行。
(1)若DX & DI,转到above执行
&&&&&&&&&& cmp dx,di
&&&&&&&&&& ja above&&&&&&&&&&&&& ;=jnbe above
(2)若AX & SI,转到greater执行
&&&&&&&&&& cmp ax,si
&&&&&&&&&& jg greater&&&&&&&&&&& ;=jnle greater
(3)若CX = 0,转到zero执行
&&&&&&&&&& cmp cx,0
&&&&&&&&&& jz zero&&&&&&&&&&&&&& ;= jcxz zero&&
(4)若AX-SI产生溢出,转到overflow执行;
&&&&&&&&&& cmp ax,si
&&&&&&&&&& jo overflow
(5)若SI&AX,转到less_eq执行;
&&&&&&&&&& cmp si,ax&&&&&&&&&&&& ; cmp ax,si
&&&&&&&&&& jle less_eq&&&&&&&&&& ; jge less_eq
(6)若DI&DX,转到below_eq执行。
&&&&&&&&&& cmp di,dx&&&&&&&&&&&& ; cmp dx,di
&&&&&&&&&& jbe below_eq&&&&&&&&& ; jae below_eq
〔习题2.25〕有一个首地址为array的20个字的数组,说明下列程序段的功能。
&&&&&&&&&& mov cx,20
&&&&&&&&&& mov ax,0
&&&&&&&&&& mov si,ax
sum_loop:& add ax,array[si]
&&&&&&&&&& add si,2
&&&&&&&&&& loop sum_loop
&&&&&&&&&& mov total,ax
将首地址为array得20个字的数组求和,并将结果存入 total 单元中。
〔习题2.26〕按照下列要求,编写相应的程序段:
(1)起始地址为string的主存单元中存放有一个字符串(长度大于6),把该字符串中的第1个和第6个字符(字节量)传送给DX寄存器。
(2)从主存buffer开始的4个字节中保存了4个非压缩BCD码,现按低(高)地址对低(高)位的原则,将它们合并到DX中。
(3)编写一个程序段,在DX高4位全为0时,使AX = 0;否则使AX = -1。
(4)有两个64位数值,按&小端方式&存放在两个缓冲区buffer1和buffer2中,编写程序段完成buffer1-buffer2功能。
(5)假设从B800h : 0开始存放有100个16位无符号数,编程求它们的和,并把32位的和保存在DX.AX中。
(6)已知字符串string包含有32KB内容,将其中的&$&符号替换成空格。
(7)有一个100个字节元素的数组,其首地址为array,将每个元素减1(不考虑溢出)存于原处。
(8)统计以 &$& 结尾的字符串srting的字符个数。
(1)解答:
&&&&&&&&&& mov si,0
&&&&&&&&&& mov dl,string[si]&& ;第1个字符送dl寄存器:mov dl,stirng[0]
&&&&&&&&&& mov si,5
&&&&&&&&&& mov dh,string[si]&& ;第6个字符送dh寄存器:mov dl,stirng[5]
(2)解答:
&&&&&&&&&& xor si,si&&&&&&&&&& ;si清零
&&&&&&&&&& mov al,buffer[si]&& ;第一字节
&&&&&&&&&& inc si
&&&&&&&&&& mov ah,buffer[si]&& ;第二字节
&&&&&&&&&& mov cl,4
&&&&&&&&&& shl ah,cl&&&&&&&&&&&& ;BCD码移到高半字节
&&&&&&&&&& or al,ah&&&&&&&&&&&&& ;组合成压缩BCD码
&&&&&&&&&& mov dl,al&&&&&&&&&&&&&&&&&& ;存入dl寄..
&&&&&&&&&& inc si
&&&&&&&&&& mov al,buffer[si]&& ;第三字节
&&&&&&&&&& inc si
&&&&&&&&&& mov ah,buffer[si]&& ;第四字节
&&&&&&&&&& mov cl,4
&&&&&&&&&& shl ah,cl&&&&&&&&&& &&;BCD码移到高半字节
&&&&&&&&&& or al,ah&&&&&&&&&&& &&;组合成压缩BCD码
&&&&&&&&&& mov dh,al&&&&&&&&&& &&;存入dh寄..
(3)解答:
&&&&&&&&&& test dx,0f000h&&&&&&& ; test dh,0f0h
&&&&&&&&&& jz next&&&&&&&&&&&&&& ; jnz next
&&&&&&&&&& mov ax,-1&&&&&&&&&&&& ; mov ax,0
&&&&&&&&&& jmp again
next:&&mov ax,0&&&&&&&&&&&&& ; mov ax,0ffffh
again:&&&& ...
(4)解答:
&&&&&&&&&& mov ax, word ptr buffer1
&&&&&&&&&& sub ax, word ptr buffer2&&&& ;先减低16位
&&&&&&&&&& mov dx, word ptr buffer1+2
&&&&&&&&&& sbb dx, word ptr buffer2+2&& ;后减高16位,需减低16位的借位
(5)解答:
&&&&&&&&&& mov ax,0b800h
&&& &&&&&&&&&mov ds,ax&&&&&& ;段地址
&&&&&&&&&&& &xor si,si&&&&&& ;地址偏移量si=0
&&&& &&&&&&&&xor dx,dx&&&&&& ;和的高字dx=0
&& &&&&&&&&&&mov cx,99&&&&&& ;加的次数
&& &&&&&&&&&&mov ax,[si]&& &&;第一个数
again:& inc si&&&&&&&&&& ;指向下一个字单元
&& &&&&&&&&&inc si
&& &&&&&&&&&add ax,[si]&&&& ;加下一个数
&&& &&&&&&&&jnc& noc&&&&&&&& ;无进位转
&&& &&&&&&&&inc dx&&&&&&&&&& ;有进位dx=dx+1
&&&& noc:& dec cx&&&&&&&&&& ;次数-1
&&& &&&&&&&&jnz cx,again&& &;非0继续加
(6)解答1:不使用串操作指令(更好)
&&&&&&&&&& mov si,offset string
&&&&&&&&&& mov cx,8000h&&&&&&&&& &&& ; 32k=2^15=8000h
again:&&&& cmp byte ptr [si], &$&&& ;&$& =24h
&&&&&&&&&& jnz next&&&&&&&&&&&&& &&& ; 不要采用 jz 进行分支
&&&&&&&&&& mov byte ptr [si], && && ;& &=20h
next:&&&&& inc si
&&&&&&&&&& loop again&&&&&&&&&&& &&& ; dec cx
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&& ; jnz again
(6)解答2:使用串操作指令
&&&&&&&&&& mov di,offset string
&&&&&&&&&& mov al,&$&
&&&&&&&&&& mov cx,8000h
&&&&&&&&&& cld
again:&&&& scasb
&&&&&&&&&& jnz next
&&&&&&&&&& mov byte ptr es : [di-1], && &
next:&&&&& loop again
(7)解答1:
&&&&&&&&&& mov si,offset array&&
&&&&&&&&&& mov cx,100
again:&&&& dec byte ptr [si]
&&&&&&&&&& inc si
&&&&&&&&&& loop again
(7)解答2:
&&&&&&&&&& xor si,si&&&&&&&&&&&& && ; si&--0
&&&&&&&&&& mov cx,100&&&&&&&&&&& && ; 循环次数
&again:&&& dec array[si]
&&&&&&&&&& inc si
&&&&&&&&&& loop again
(7)解答3:
&&&&&&&&&& mov si,offset array
&&&&&&&&&& mov di,si
&&&&&&&&&& mov ax,ds&&&&&&&&&&
&&&&&&&&&& mov es,ax
&&&&&&&&&& mov cx,100
&&&&&&&&&& cld
again:&&lodsb&
&&&&&&&&&& dec al
&&&&&&&&&& stosb
&&&&&&& && loop again
(8)解答:
&&&&&&&&&& xor si,si&&&&&&& &&&&&&&;si&--0
coun:&&&&& cmp string[si],'$'
&&&&&&&&&& je& done
&&&&&&&&&& inc si
&&&&&&&&&& jmp coun
done:&&&&& ... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
〔习题2.27〕对下面要求,分别给出3种方法,每种方法只用一条指令。
(1)使CF=0&&& (2)使AX=0&&& (3)同时使AX=0和CF=0
(1)解答:
&&&&&&&& clc
&&&&&&&& and ax,ax
&&&&&&&& or ax,ax
(2)解答:
&&&&&&&& xor ax,ax
&&&&&&&& and ax,0
&&&&&&&& mov ax,0
(3)解答:
&&&&&&&& and ax,0
&&&&&&&& xor ax,ax
&&&&&&&& sub ax,ax
〔习题2.28〕参照本习题的示意图,分析调用序列,画出每次调用及返回时的堆栈状态。其中CALL前是该指令所在的逻辑地址;另外,段内直接调用指令的机器代码的字节数为3,段间直接调用指令则为5个字节。
主程序转子suba时段内调用:断点1为2000h:0400h+3,
转子是只将IP压栈。
suba转子subb时段间调用:断点2为2000h:0840h+5, 转子时须将cs段地址和IP压栈
suba转子subc时段内调用:断点3为2000h:0c021h+3,转子是只将IP压栈。
注:压栈时先修改sp再压入断点,弹栈时先弹出断点再修改sp。
〔习题2.29〕已知AX 、BX存放的是4位压缩BCD表示的十进制数,请说明如下子程序的功能和出口参数。
&&&&&&&&&& add al,bl
&&&&&&&&&& daa
&&&&&&&&&& xchg al,ah
&&&&&&&&&& adc al,bh
&&&&&&&&&& daa
&&&&&&&&&& xchg al,ah
&&&&&&&&&& ret
&&&& 压缩BCD码加法:AX&AX+BX
&&& 出口参数:AX=BCD码和
〔习题2.30〕AAD指令是用于除法指令之前,进行非压缩BCD码调整的。实际上,处理器的调整过程是:AL&AH&10+AL,AH&0。如果指令系统没有AAD指令,请用一个子程序完成这个调整工作。
&&&&&&&&&& shl ah,1&&&&&&& &;ah=2*a& (设原ah=a)
&&&&&&&& &&&&mov dl,ah&&&&&& &;dl=2*a
&&&&&&& &&&&&mov cl,2&&&&&&& &;设定移位次数
&&&&&&& &&&&&shl ah,cl&&&&&& &;ah=8*a
&&&&&&&& &&&&add ah,dl&&&&&& &;ah=10*a
&&&&&&&& &&&&add al,ah&&&&&& &;al=10*a+al
&&&&&&& &&&&&xor ah,ah&&& &&&&;清零ah
&&&&&&& &&&&&int 3&&&&&&& &&&&&;返回DOS
&&&&& 注意: 入口:AX中存放有&和&(两非压缩BCD码)
&&&&&&&&&&& 出口:AL中 已为调整后的二进制数
〔习题2.31〕解释如下有关中断的概念:
(1) 内部中断和外部中断
(2) 单步中断和断点中断
(3) 除法错中断和溢出中断
(4) 中断向量号和中断向量表
(1)内部中断是由于8086CPU内部执行程序引起的程序中断;外部中断是来自8086CPU之外的原因引起的程序中断;
(2)单步中断是若单步标志TF为1,则在每条指令执行结束后产生的中断;断点中断是供调试程序使用的,它的中断类型号为3通常调试程序时,把程序按程序的任务分成几段,然后,每段设一个段点;
(3)除法错中断是在执行除法指令时,若除数为0或商超过了寄存器所能表达的范围产生的中断;溢出中断是在执行溢出中断指令INTO时,若溢出标志OF为1时产生的中断;
(4)中断向量号是 中断类型号;中断向量表是中断向量号与它所对应的中断服务程序起始地址的转换表。
〔习题2.32〕试比较INT n和段间CALL指令、IRET和段间RET指令的功能。
INT n 响应中断时,除象CALL保护断点外,还应保护FR;段间CALL指令用在主程序中实现子程序的调用。IRET 返回时,除象RET恢复断点外,还应恢复FR;子程序执行完成后,应返回主程序中继续执行,这一功能由RET指令完成。
〔习题2.33〕什么是系统功能调用?汇编语言中,它的一般格式是怎样的?
系统功能调用是用户在程序一级请示操作系统服务的一种手段,它不是一条简单的硬指令,而是带有一定功能号的&访指令&,它的功能并非由硬件直接提供,而是由操作系统操作系统中的一段程序完成的,即由软件方法实现的
汇编语言中,它的一般格式是分如下四步进行:
(1)在AH寄存器置系统功能调用号;
(2)在指定的寄存器中设置 入口参数;
(3)用INT21H(或ROM&BIOS的中断向量号)指令执行功能调用;
(4)据出口参数分析功能调用运行情况。
〔习题2.34〕补充例2.40,当有溢出时显示&Error! Overflow!&,无溢出时显示&OK&。
okmsg&&&&& db &OK&, &$&
errmsg&&&& db &Error ! Overflow !&, &$&
&&&&&&&&&&&&&& & &&&&&&&
&&&&&&&&&&&&& & mov ax,X
&&&&&&&&&&&&&&& sub ax,Y
&&&&&&&&&&&&&&& jo overflow
&&&&&&&&&&&&&&& mov dx,offset okmsg
&&&&&&&&&&&&&&& jmp next
overflow:& mov dx,errmsg
&&& next:&&&&& mov ah,9
&&&&&&&&&&&&&&&&& &int 21h
错误解答:
&&&&&&&&&& & mov ax,X
&&&&&&&&&& & sub ax,Y
&&&&&&&&&& & jo overflow
&&&&&&&&&&&& mov dx,offset okmsg&&&&&&&
okmsg&&db &OK&, &$&&&&
&&&&&&&&&&& & mov dx,errmsg&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&;错误1:数据定义在代码中
&&&&&&&&&&&& & mov ah,9
&&&&&&&&&&&& & int 21h
overflow:& errmsg db &Error ! Overflow !&, &$&&&&&&&&&&&
&&&&&&&&&& mov dx,errmsg&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&; 错误2:缺少JMP指令
&&&&&&&&&& mov ah,9
&&&&&&&&&& int 21h
〔习题2.35〕补充例2.42,显示&1&的个数;注意首先将个数转换为ASCII码。
&&&&&&&&&&&& and al,7fh&&&& &;使d7=0
&&&&&&&&&&&& mov dl,al&&&& && ;转存于dl
&&&&&&&&&&&& jnp next&&&&&& & ;奇数个1转&
&&&&&&&&&&&& or al,80h&&&&&& & ;偶数个1 使d7=1
&&&& next:&& xor bl,bl&&&& & ;纪录1的个数 dl=0
&&&&&&&&&&&& mov cx,8&&&&&&&& &;移位次数
&&&& again:& shl dl,1&&&&&&& &;逻辑左移1次
&&&&&&&&&&&& jnc desp&&&&&&&&& &;如cf=0 转
&&&&&&&&&&&& inc bl&&&&&&&&&&&&&&&&&;否则cf=1 个数加1
&&& desp:&& loop again&&&& ;cx=cx-1 如cx不等于0,循环
&&&&&&&&&&& or bl,30h&&&&&&&&&&& &;个数变为ASCII码
&&&&&&&&&&& mov ah,02h&&&&&&& ;在CRT上显示个数
&&&&&&&&&&& mov dl,bl
&&&&&&&&&&& int 21h
&&&&&&&&&&& ret
〔习题2.36〕先提示输入数字&Input Number:0 ~ 9&,然后在下一行显示输入的数字,结束;如果不是键入了0 ~ 9数字,就提示错误&Error!&,继续等待输入数字。
&&&&&&&&&& ; 数据段
str1&&&&&& db 'Input Number:0~9 : ',0dh,0ah,'$'&
str2&&&&&& db 'Error!',0dh,0ah,'$'
&&&&&&&&&& ; 代码段
&&&&&&&&&& mov ah,09h&&&&&&&&&&& ; 显示str1字符串
&&&&&&&&&& mov dx,offset str1
&&&&&&&&&& int 21h
getkey:&&& mov ah,1&&&&&&&&&&&&& ; 调用DOS功能
&&&&&&&&&&&& int 21h
&&&&&&&&&& cmp& al,'0'
&&&&&&&&&& jb error&&&&&&&&&&&&& ; 小于0,出错处理
&&&&&&&&&& cmp al,'9'
&&&&&&&&&& ja error&&&&&&&&&&&&& ; 大于9,出错处理
&&&&&&&&&& mov ah,02h&&&&&&&&&&& ; 调用DOS显示字符功能,显示该数字
&&&&&&&&&& mov dl,al
&&&&&&&&&& int 21h
&&&&&&&&&& ...&&&&&&&&&&&&&&&&&& ; 终止程序执行,返回DOS
error:&&&& mov ah,09h&&&&&&&&&&& ; 出错,调用DOS 功能显示str2字符串
&&&&&&&&&& mov dx,offset str2
&&&&&&&&&& int 21h
&&&&&&&&&& jmp getkey&&&&&&&&&&& ; 返回按键
〔习题2.37〕从键盘输入一个字符串(不超过255个),将其中的小写字母转换成大写字母,然后按原来的顺序在屏幕上显示。
思路:参考P67 例2.52用0ah号DOS系统功能调用,从键盘输入一个字符串,然后从键盘缓冲区逐个取字符,在&a&与&z&之间的字符为小写字母,需要转换为大写字母(减去20h),其他不变。
&&&&&&&&&& ;xt237.asm
&&&&&&&&&& .model small
&&&&&&&&&& .stack
&&&&&&&&&& .data
array&&&&& db 255
&&&&&&&&&& db 0
array1&&&& db 255 dup('$')
array2&&&& db 0dh,0ah,'$'
&&&&&&&&&& .code
&&&&&&&&&& .startup
&&&&&&&&&& mov ah,0ah&&&&&&&&&&&&&& ; 键盘输入字符串
&&&&&&&&&& mov dx,offset array
&&&&&&&&&& int 21h
&&&&&&&&&& mov dx,offset array2& &&& ; 回车换行
&&&&&&&&&& mov ah,09h
&&&&&&&&&& int 21h
&&&&&&&&&& mov bx,offset array1
again:&&&& mov al,[bx]
&&&&&&&&&& cmp al,'$'
&&&&&&&&&& jz done
&&&&&&&&&& cmp al,'a'&&&&&&&&&&&&&& ; 小于a和大于z的字符不是小写字母
&&&&&&&&&& jb next
&&&&&&&&&& cmp al,'z'
&&&&&&&&&& ja next
&&&&&&&&&& sub al,20h&&&&&&&&&&&&&& ; 在a和z之间的字符才是小写字母,转换为大写
&&&&&&&&&& mov [bx],al&&&&&&&&&&&&& ; 保存到原位置
next:&&&&& inc bx
&&&&&&&&&& jmp again
done:&&&&& mov dx,offset array1
&&&&&&&&&& mov ah,09h
&&&&&&&&&& int 21h
&&&&&&&&&& .exit 0
&&&&&&&&&& end
〔习题2.38〕指令对状态标志的作用可以分成多种情况,例如无影响、无定义、按结果影响、特别说明的影响等,你能区别这些情况吗?分别用具体的指令来说明。
〔习题2.39〕8086指令系统分成哪6个功能组?各组主要包含什么指令,举例说明。
8086指令系统分成的6个功能组是
(1)数据传送类令:
①通用数据传送指令如传送指令MOV、交换指令XCHG、换码指令XLAT
②堆栈操作指令如进栈指令PUSH出栈指令POP
③标志传送指令如标志寄存器传送;标志位操作
④地址传送指令如有效地址传送指令LEA、指针传送指令LDS指针传送指令LES
⑤输入输出指令如输入指令IN、输出指令OUT
(2)算术运算指令
①加法指令如加法指令ADD、带进位加法指令ADC、增量指令INC
②减法指令如减法指令SUB、带借位指令SBB、减量指令DEC、求补指令NEG、比较指令CMP
③乘法指令如无符号乘法指令MUL、有符号乘法指令IMUL
④除法指令如无符号数除法指令DIV、有符号数除法指令IDIV
⑤符号扩展指令如字节转换字指令CBW、字转换字节指令CWD
⑥十进制调整指令如压缩BCD码调整指令、非压缩BCD码调整指令
(3)位操作类指令
①逻辑运算指令如逻辑指令AND、逻辑或指令OR、逻辑异或指令XOR、逻辑非指令NOT、测试指令TEST
②移位指令如逻辑移位指令SHL和SHR、算术移位指令SAL和SAR
③循环移位指令如不带移位指令XOL和ROR、带移位指令RCL和RCR
(4)控制转移类指令
①无条件转移指令JMP
②条件转移指令如判断单个标志状态JZ/JE、JNZ/JNE、JS/JNS、JP/JPE、JNP/JPO、JC/JB、JNC/JNB/JAE,用于比较无符号数高低JB(JNAE)、JNB(JAE)、JBE(JNA)、JNBE(JA),用于比较有符号数大小JL(JNGE)、JNL(JGE)、JLE(JNG)、JNLE(JG)
③循环指令LOOP
④子程序指令如子程序调用指令CALL、子程序返回指令RET
⑤中断指令如INT N
(5)串操作类指令
①串传送指令MOVS
②串存储指令STOS
③串读取指令LODS
④串比较指令CMPS
⑤串扫描指令SCAS
⑥重复前缀指令REP;
(6)处理机控制类指令
①空操作指令NOP
②段超越前缀指令SEG
③封锁前缀指令LOCK
④暂停指令HLT
⑤交权指令ESC
⑥等待指令WAIT。
〔习题2.40〕总结8086指令系统所采用的各种寻址方式,包括一般的数据寻址、外设数据寻址、堆栈数据寻址、串操作数据寻址、转移指令目的地址的寻址等,并举例说明。
1. 一般的数据寻址
立即数寻址方式如:mov al,05h
寄存器寻址方式如:mov bx,ax
存储器寻址方式
(1)直接寻址方式如:mov ax,[2000h]
(2)寄存器间接寻址方式如:mov ax,es:[2000h]
(3)寄存器相对寻址方式如:mov ax,[di+06h]
(4)基址变址寻址方式如:mov ax,[bx+si]
(5)相对基址变址寻址方式如:mov ax,[bx+si+06h]
2. 外设数据寻址
输入指令IN,如:
输出指令OUT,如:
3. 堆栈数据寻址
进栈指令PUSH,如:PUSH [2000H]
出栈指令POP,如:POP [2000H]
4. 串操作数据寻址
5. 转移指令目的地址的寻址
直接寻址、间接寻址、相对寻址
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:108350次
积分:1459
积分:1459
排名:第19379名
原创:30篇
转载:47篇
(2)(1)(5)(2)(2)(2)(4)(2)(11)(14)(27)(2)(2)(1)}

我要回帖

更多关于 反汇编 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信