(5) XCHG [SI],30H (6) OUT DX,AH (7) IN AL,3FCH (8) MUL 5
答:(1) POP指令不允许使用CS
(2) 两操作数不能同时是存储器寻址方式 (3) 堆栈的操作必须以字为单位 (4) 段寄存器不允许直接参加运算
(5) XCHG指令的操作数不允许是立即数 (6) OUT指令只能用AL做源操作数
(7) 端口号大于255,必须将其放到DX中 (8) MUL指令源操作数不允许是立即数 6. 请分别用一条汇编语言指令完成如下功能。
(1) 把BX寄存器和DX寄存器的内容相加,结果存入DX寄存器。
(2) 用寄存器BX和SI的基址变址寻址方式把存储器的一个字节与AL寄存
器的内容相加,并把结果送到AL中。
(3) 用BX和位移量0B2H的寄存器相对寻址方式把存储器中的一个字和
CX寄存器的内容相加,并把结果送回存储器中。
(4) 把数0A0H与AL寄存器的内容相加,并把结果送回AL中。 答:(1)ADD DX,BX
(2)ADD AL,[BX+SI] (3)ADD [BX+0B2H],CX (4)ADD AL,0A0H
7. 求出以下各十六进制数与十六进制数58B0之和,并根据结果设置标志位SF、ZF、CF和OF的值。 (1) 1234H (2) 5678H (3) 0AF50H (4) 9B7EH
答:(1)和为6AE4H,SF=0,ZF=0,CF=0,OF=0 (2)和为0AF28H,SF=1, ZF=0, CF=0, OF=1 (3)和为0800H, SF=0, ZF=0, CF=1, OF=0 (4)和为0F42EH, SF=1, ZF=0, CF=0, OF=0
8. 执行指令ADD AL,72H前,(AL)=8EH,标志寄存器的状态标志OF、SF、ZF、AF、PF和CF全为0,指出该指令执行后标志寄存器的值。
答:指令执行后,AL的内容为0000000H,且有进位,标志寄存器中各标志位的值为:OF=0,SF=0,ZF=1,AF=1,PF=1,CF=1 9. 已知程序段如下: MOV AX,1234H MOV CL,4 ROL AX,CL DEC AX MOV CX,4 MUL CX
试问:1、每条指令执行完后,AX的内容是什么? 2、每条指令执行完后,CF、SF和ZF的值是什么? 3、程序执行完后,AX和DX的内容是什么? 答:(1)(2)
MOV AX,1234H ; (AX)=1234H,各标志位不变 MOV CL,4 ; (AX)=1234H,各标志位不变
ROL AX,CL ; (AX)=2341H,CF=1,其它标志位不变 DEC AX ; (AX)=2340H,CF不变,SF=0,ZF=0 MOV CX,4 ; (AX)=2340H,各标志位不变 MUL CX ; (AX)=8D00H,CF=0,ZF=0,SF=0 (3)程序执行完后,(AX)=8D00H,(DX)=0000H
10. 编程序段,将AL、BL、CL、DL相加,结果存在DX中。 答:MOV AH,0
ADD AL,BL ADC AH,0 ADD AL,CL ADC AH,0 ADD AL,DL ADC AH,0 MOV DX,AX
11. 编程序段,从AX中减去DI,SI和BP中的数据,结果送BX。 答:SUB AX,DI
SUB AX,SI SUB AX,BP MOV BX,AX
12. 假设(BX)=0E3H,变量VALUE中存放的内容为79H,确定下列各指令单独执行后的结果。
(1) OR BX,VALUE (2) AND BX,VALUE (3) XOR BX,OFFH (4) AND BX,01H (5) TEST BX,05H
(6) XOR BX,VALUE 答: (1) (BX)=0FBH
(2) (BX)=61H (3) (BX)=1CH (4) (BX)=01H (5) (BX)=0E3H (6) (BX)=9AH
13. 已知数据段500H~600H处存放了一个字符串,说明下列程序段执行后的结果。
MOV SI,600H MOV DI,601H MOV AX,DS
MOV ES,AX MOV CX,256 STD
REP MOVSB
答:将数据段501H~600H中存储的字符串移到数据段502~601H中 14. 说明下列程序段的功能。
CLD
MOV AX,0FEFH MOV CX,5
MOV BX,3000H MOV ES,BX MOV DI,2000H REP STOSW
答:将附加段的32000H开始的连续5个字初始化为0FEFH 15. 判断下列程序段跳转的条件。 (1) XOR AX,1E1EH JE EQUAL
(2) TEST AL,10000001B JNZ THERE (3) CMP CX,64H JB THERE
答:(1) AX中的值为1E1EH时会跳转(2) AL的最低和最高位至少有一位为1时发生跳转
(3) CX中的值小于64H时发生跳转 16. 选取正确指令,完成以下任务。
(1) 右移DI三位,并将0移入最左一位。(2) AL内容左移一位,0移入最后一位。(3) DX寄存器右移一位,并且使结果的符号位与原符号位相同。 答:(1) MOV CL,3 SHR DI,CL
(2) SHL AL,1(3) SAR DX,1
17. 假设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) CMP DX,DI JA ABOVE
(2) CMP AX,SI JG GREATER (3) CMP CX,0 JE ZERO (4)CMP AX,SI
JO OVERFLOW (5) CMP AX,SI
JGE LESS_EQ (6) CMP DX,DI
JAE BELOW_EQ
18. 有一个首地址为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单元 22. 已知内存中起始地址为BLOCK的数据块(字节数为COUNT)的字节数据
有正有负。试编写一个程序,将其中的正、负分开,分别送至同一段中的两个缓冲区,设正、负缓冲区的首地址分别为PLUS和MINUS。 答: DATA SEGMENT
BLOCK DB 16 DUP(?) PLUS DB 16 DUP(?) MINUS DB 16 DUP(?) DATA ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX
MOV SI,OFFSET BLOCK MOV DI,OFFSET PLUS MOV BX,OFFSET MINUS MOV CX,COUNT NEXT:MOV AL,[SI] TEST AL,80H JNZ MD
MOV [DI],AL INC DI JMP AGAIN MD: MOV [BX],AL INC BX AGAIN: INC SI LOOP NEXT MOV AH,4CH INT 21H CODE ENDS END START
19. 按照下列要求,编写相应的程序段。
(1) 已知字符串STRING包含有32KB内容,将其中的“$”符号替换成空格。
(2) 有一个100个字节元素的数组,其首地址为ARRAY,将每个元素减1
(不考虑溢出)存于原处。
(3) 统计以“$”结尾的字符串STRING的字符个数
(4) 假设从B800H:0开始存放有16个16位无符号数,编程求它们的和,
并把32位的和保存在DX、AX中。
答:(1)
MOV SI,0
MOV CX,8000H
AGAIN:CMP STRING[SI],’$’ JNZ NEXT
MOV STRING[SI],20H NEXT:INC SI LOOP AGAIN
(2)
MOV SI,0 MOV CX,100
AGAIN:DEC ARRAY[SI] INC SI LOOP AGAIN
(3)
XOR SI,SI
COMP:CMP STRING[SI],’$’ JE OVER INC SI JMP COMP OVER:RET (4)
MOV AX,0B800H MOV DS,AX XOR SI,SI XOR DX,DX MOV CX,0FH MOV AX,[SI] AGAIN:INC SI INC SI
ADD AX,[SI] JNC NEXT INC DX
NEXT:LOOP AGAIN