汇编语言习题答案(2) 下载本文

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