1、(5)AX4C2AH偏移地址=bx+1100h=1200h(6)AX7856H偏移地址=bx+si=0100h+0002h=0102h(7)AX65B7H偏移地址=bx+si+1100h=0100h+0002h+1100h=1202h习题2.2指出下列指令的错误(1) mov cx,dl(2) mov ip,ax(3) mov es,1234h(4) mov es,ds(5) mov al,300(6) mov sp,ax(7) mov ax,bx+di(8) mov 20h,ah(1)两操作数类型不匹配(2)IP指令指针禁止用户访问(3)立即数不允许传给段寄存器(4)段寄存器之间不允许传送(
2、5)两操作数类型不匹配(6)目的操作数应为 SI (7)源操作数应为 BX+DI(8)立即数不能作目的操作数习题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 almov al,89h AL=89h CF ZF SF OF PFadd al,al AL=12h 1 0 1; 1000 1001+1000 1001 10001 0010 add al,9dh AL=0afh 0001 0010+ 1001 1101 1010 1111 c
3、mp al,0bch 1010 1111-1011 1100* 0100 0011sub al,al AL=00hdec al AL=0ffh 0000 0000- 0000 0001*1111 1111inc al1111 1111+0000 0001习题2.8请分别用一条汇编语言指令完成如下功能:(1)把BX寄存器和DX寄存器的内容相加,结果存入DX寄存器。(2)用寄存器BX和SI的基址变址寻址方式把存储器的一个字节与AL寄存器的内容相加,并把结果送到AL中。(3)用BX和位移量0B2H的寄存器相对寻址方式把存储器中的一个字和CX寄存器的内容相加,并把结果送回存储器中。(4)用位移量为05
4、20H的直接寻址方式把存储器中的一个字与数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,Xax=X imul YDX.AX=X*Y mov cx,axcx=X*Y的低16位 mox bx,dxbx=X*Y的高16位 m
5、ov ax,Zax=Z cwd add cx,axcx=Z的低16位+X*Y的低16位 adc bx,dxbx=Z的高16位+X*Y的高16位+低位进位 sub cx,540cx=Z的低16位+X*Y的低16位-540 sbb bx,0bx=Z的高16位+X*Y的高16位+低位进位-低位借位 mov ax,Vax=V sub ax,cxax=V的低16位-(Z的低16位+X*Y的低16位-540) sbb dx,bxdx=V的高16位-(Z的高16位+X*Y的高16位+低位进位-低位借位)-低位借位 idiv X ;/X V-(X*Y+Z-540)/X AX存商,DX存余数 习题2.22判断下
6、列程序段跳转的条件 (1) xor ax,1e1eh je equal (2)test al,10000001b jnz there (3)cmp cx,64h jb there(1)AX1e1eh(异或后为0)(2)AL的D0或D7至少有一位为1(3)CX(无符号数) 64h习题2.23设置CX = 0,则LOOP指令将循环多少次?例如: mov cx,0delay: loop delay 216次。习题2.25有一个首地址为array的20个字的数组,说明下列程序段的功能。 mov cx,20 mov ax,0 mov si,axsum_loop: add ax,arraysi add s
7、i,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
8、中,编写程序段完成buffer1buffer2功能。(5)假设从B800h : 0开始存放有100个16位无符号数,编程求它们的和,并把32位的和保存在DX.AX中。(6)已知字符串string包含有32KB内容,将其中的$符号替换成空格。(7)有一个100个字节元素的数组,其首地址为array,将每个元素减1(不考虑溢出)存于原处。(8)统计以 $ 结尾的字符串srting的字符个数。(1)解答: mov si,0 mov dl,stringsi ;第1个字符送dl寄存器:mov dl,stirng0 mov si,5 mov dh,stringsi第6个字符送dh寄存器:mov dl,st
9、irng5(2)解答: xor si,sisi清零 mov al,buffersi第一字节 inc si mov ah,buffersi第二字节 mov cl,4 shl ah,clBCD码移到高半字节 or al,ah组合成压缩BCD码 mov dl,al存入dl寄.第三字节第四字节 mov dh,al存入dh寄.(3)解答: test dx,0f000h test dh,0f0h jz next jnz next mov ax,-1 jmp againnext: mov ax,0 mov ax,0ffffhagain: .(4)解答: mov ax, word ptr buffer1 su
10、b 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段地址地址偏移量si=0 xor dx,dx和的高字dx=0 mov cx,99加的次数 mov ax,si第一个数 inc si指向下一个字单元 add ax,si加下一个数 jnc noc无进位转 inc dx有进位dx=dx+1 noc: dec cx次数-1 jnz cx,again非0继续加 (6)解答1:不使用串操作指令(更好)
11、mov si,offset string mov cx,8000h 32k=215=8000h cmp byte ptr si, $ 24h jnz next 不要采用 jz 进行分支 mov byte ptr si, 20h loop again dec cx jnz again(6)解答2:使用串操作指令 mov di,offset string mov al,$ mov cx,8000h cld scasb mov byte ptr es : di-1, loop again(7)解答1: mov si,offset array mov cx,100 dec byte ptr si(7)
12、解答2: si-0 mov cx,100 循环次数 dec arraysi(7)解答3: mov si,offset array mov di,si mov ax,ds mov es,ax lodsb stosb(8)解答:sicoun: cmp stringsi,$ je done jmp coundone: .习题4.9编制一个程序,把变量bufX和bufY中较大者存入bufZ;若两者相等,则把其中之一存入bufZ中。假设变量存放的是8位无符号数。 .model small .stack 256 .databufx db ?bufYbufz .code .startup mov al, b
13、ufX mov bl, bufY cmp al,bl ja next mov bufZ, bl jmp done next: mov bufZ, al .exit 0 end习题4.10设变量bufX为有符号16位数,请将它的符号状态保存在signX,即:如果X大于等于0,保存0;如果X小于0,保存-1(ffh)。编写该程序。 .stackbufX dw -7signX cmp bufX,0test bufX,80h jl nextjnz next mov signX,0 mov signX,-1习题4.11bufX、bufY和bufZ是3个有符号16进制数,编写一个比较相等关系的程序:(1)
14、如果这3个数都不相等,则显示0;(2)如果这3个数中有两个数相等,则显示1;(3)如果这3个数都相等,则显示2。 dw ? mov ax, bufX mov bx, bufY mov cx, bufZ mov dl, 0 cmp ax,bx jnz next1 inc dlnext1: cmp ax,cx jnz next2next2: cmp bx,cx jnz next3next3: cmp dl,3 jb next4 mov dl,2next4: mov ah,02h显示 int 21h1.什么是8088中的逻辑地址和物理地址?1MB最多能分成多少个逻辑段?请将如下逻辑地址用物理地址表达
15、: FFFFH:0 40H:17H 2000H:4500H B821H:4567H物理地址:物理存储单元具有的一个唯一的20位编号逻辑地址:在8088内部和用户编程时,所采用的“段地址:偏移地址”形式将逻辑地址中的段地址左移二进制4位(对应16进制是一位,即乘以16),加上偏移地址就得到20位物理地址1MB最多能分成1MB16B22024216个逻辑段,因为每隔16个字节单元就可以开始一个逻辑段 FFFFH: 40H:17H00417H 2000H:4500H24500H B821H:4567HBC777H习题2.68088有哪4种逻辑段,各种逻辑段分别是什么用途?代码段(Code Segme
16、nt)用来存放程序的指令序列。处理器利用CS : IP取得下一条要执行的指令堆栈段(Stack Segment)确定堆栈所在的主存区域。处理器利用SS : SP操作堆栈中的数据数据段(Data Segment)存放当前运行程序所用的数据。处理器利用DS : EA存取数据段中的数据附加段(Extra Segment)是附加的数据段,也用于数据的保存。处理器利用ES :习题2.8已知DS2000H、BX0100H、SI0002H,存储单元20100H20103H依次存放12H、34H、56H、78H,21200H21203H依次存放2AH、4CH、B7H、65H,说明下列每条指令执行完后AX寄存器
17、的内容,以及源操作数的寻址方式? mov ax,1200h mov ax,bx mov ax,1200h mov ax,bx mov ax,bx+1100h mov ax,bx+si mov ax,bxsi+1100h mov ax,1200h ;AX1200H, 立即数寻址 mov ax,bx ; AX0100H, 寄存器寻址 mov ax,1200h ;AX4C2AH, 直接寻址 mov ax,bx ;AX3412H, 寄存器间接寻址 mov ax,bx+1100h ;AX4C2AH, 寄存器相对寻址 mov ax,bx+si ;AX7856H, 基址变址寻址 mov ax,bxsi+1100h ;AX65B7H,相对基址变址寻址习题2.9说明下面各条指令的具体错误原因 mov cx,dl mov ip,ax mov es,1234h mov es,ds mov al,300
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1