17. 执行下列指令序列
mov al,81h add al,al adc al,al
后,AL= B 。
A 04H B 05H C 204H D 205H
18. 假定DS=4000H、DI=0100H、[40100H]=55H、[40101H]=AAH,那么执行指令“lea
bx,[di]”后,BX= C 。
A AA55H B 55AAH C 0100H D 4100H
19. 设AL=20H、SI=0500H、DS=3000H、[30500H]=0C0H、CF=1。执行“SBB AL,[SI]”
指令后,正确的结果是 C 。
A AL=5FH、SF=1、CF=1 B AL=60H、SF=1、CF=0 C AL=5FH、SF=0、CF=1 D AL=60H,SF=0、CF=0 二、填空题
1. 指令SAR可用来对 有符号 数除以2,而指令SHR可用来对 无符号 数除
以2。MUL BX指令的结果存在 DX 和 AX 寄存器中,等效于loop指令的两条指令依次是 DEC CX 和 JNZ 。
2. 已知SI=1000H,AX=ABCDH、SP=0100H、BP=00FEH,给出下列指令顺序执行后,
指定寄存器中的内容.
push ax ;AX= ABCDH 、SP= 00FEH push si ;SI= 1000H 、SP= 00FCH pop ax ;AX= 1000H 、SP= 00FEH push bp ;BP= 00FEH 、SP= 00FCH pop si ;SI= 00FEH 、SP= 00FEH pop bp ;BP= ABCDH SP= 0100H
push ax ;AX= 1000H 、SP= 00FEH
pop bx ;BX= 1000H 、SP= 0100H
3. 设DS=2000H、BX=1256H,变量table的偏移地址为20A1H,[232F7H]=3280H。
请问下列指令分别执行后,IP的值各是多少? ① jmp bx ;IP= 1256H ② jmp table [bx] ;IP= 3280H
三、问答题
1. 试述mov ax,bx和mov ax,[bx]两条语句的异同点? 相同:实现将数据传送到AX寄存器。
不同:两者的源操作数不同。前者来自BX本身,后者来自BX指向的存储单元。
2. 请指出如下各条指令的错误原因,并按照原意修改正确: ① mov [di],8000h
没有明确是字操作,改为:mov word ptr [di],8000h
②rcl ax,bl
移位指令只能采用CL寄存器指明移位位数,正确为:rcl ax,cl
5
③add bx+si,cx
目的操作数采用基址变址寻址方式,需要使用方括号。正确为:add [bx+si],cx
④mov [bx]si,ax
目的操作数采用基址变址寻址方式,需要使用方括号将寄存器都扩进去。正确为: add [bx][si],cx (或者为add [bx+si],cx)
3. 什么是堆栈,它的基本操作有哪两个,对应哪两种指令? 堆栈是一种按“先进后出”原则存取数据的存储区域。
堆栈的两种基本操作是压栈和出栈,对应的指令是PUSH和POP。
4. 试述“cmp ax,bx”和“sub ax,bx”两条语句的异同点?
相同:都执行AX-BX操作,影响所有标志位且对标志位的影响相同。 不同:CMP指令执行后AX和BX 内容不改变;而SUB指令执行后,AX内容为AX-BX之差,即内容变化了。
5. 不管是段内返回还是段间返回,子程序均用RET指令.试回答: ①执行段内返回RET指令时,执行的操作是什么?
栈顶一个字的内容送指令指针,IP ←SS:SP, SP←SP+2 ②执行段间返回RET指令时,执行的操作是什么?
栈顶一个双字的内容送指令指针和代码寄存器,IP ←SS:SP, SP←SP+2;CS ←SS:SP, SP←SP+2;
6. 什么是短转移(short)、近转移(near)和远转移(far)?什么是段内转移和段间转移?8086
有哪些指令可以实现段间转移?
短转移:段内-128~127之间的转移,位移量用一个字节表示。 近转移:段内±32K之间的转移,位移量用一个字表示。 远转移:段间1MB范围的转移。
段内转移:在同一个代码段内的转移,可以是短转移或者近转移。 段间转移:转移到另一个代码段,就是远转移。
7. 判断下列程序段跳转的条件。 ① xor ax,1e1eh je equal AX=1e1eh
② test al,10000001b jnz there
AL中D0和D7至少有一位为1 ③ cmp cx,64h jb there
CX内无符号数小于64h 五、程序设计题
6
1. 请分别用一条指令完成如下要求:
①将立即数80H送到地址为num的存储单元中; mov byte ptr num,80H
②将地址为array的存储单元中的字数据循环右移一位; ror word ptr array,1
③测试地址为BUFFER的字数据的符号位; test word ptr buffer,8000h
④将首地址为array的字数组中第5个数据送往寄存器BX中; mov bx , array[8]
⑤将AX的内容,减去0520H,并减去上次运算的借位。 Sbb ax,0520h
2. 按下列要求分别写出一条指令: ①AX寄存器的低4位清0; and ax, 0fff0h
②BX寄存器的低4位置1; or bx , 000fh
③CX寄存器的低4位取反; xor cx, 000fh
④测试DL寄存器的第3位和第5位是否同时为0; test dl, 00101000b
⑤如果AL是数字0~9的ASCII码,则将它转换为对应的非压缩BCD码;如果AL是数字0~9的非压缩BCD码,则将它转换为对应的ASCII码。即用一条指令实现数字0~9的ASCII码与非压缩BCD码的相互转换。
Xor al,30h
数字0~9的ASCII码是30H~39H,而对应的非压缩BCD码是00h~09h,两者只是D5D4相反。所以用XOR指令实现求反,完成互相转换。
3. 请分别用一个程序段完成如下要求: ①将一个字节数据FDH输出到端口21H; mov al , 0fdh out 21h , al
②将AL中的两位BCD码分离,分别存放DL和DH中; mov dl, al and dl,0fh
7
mov dh ,al mov cl,4 shr dh ,cl
③将AL中的8位有符号数转换成它的绝对值; and al,0ffh
jns done ; 如果是正数,则无需转换 neg al ; 如果是负数,则求补 done : ……..
④将DX、AX寄存器中的32位数实现算术右移一位; sar dx,1 ;如果是逻辑右移,应使用指令“shr dx,1” rcr ax,1 ;不能采用指令“ror ax,1”
4. 按照如下各题要求,分别编写一个程序段。
①把变量bufX和bufY中较大者存入bufZ;若两者相等,则把其中之一存入bufZ中。假设变量存放的是8位无符号数.
mov al, bufX cmp al,bufY jae goon mov al, bufY goon: mov bufZ, al
②统计以“$”结尾的字符串string的字符个数. mov ax ,0
mov bx, offset string
again: cmp [bx],byte ptr ‘$’ jz done inc ax inc bx jmp again
done:…… ;字符个数存放在AX寄存器
8