微型计算机原理(第六版)姚向华编著(转载请注明出处—https://www.cnblogs.com/qingl)
第三章P118
-
指出下列指令中源操作数和目的操作数的寻址方式: 源操作数 目的操作数
(1)MOV SI,1000 立即数寻址 寄存器寻址
(3)MOV [SI],1000 立即数寻址 寄存器间接寻址
(5)AND DL,[BX + SI + 20H] 相对的基址加变址寻址 寄存器寻址
(7)POP AX 寄存器寻址 寄存器寻址
(8)MOV EAX,COUNT[EDX*4] 寄存器相对寻址 直接寻址
-
指出下列指令语法是否正确,若不正确请说明原因。
(01)MOV DS,0100H
(02)MOV BP,AL
(03)XCHG AX,2000H
(04)OUT 310H,AL
(07)MOV AX,[SI + DI]
(09)AND AX,BL
(11)MOV [BX],[SI]
(12)MOV CS,[1000]
解:
01)不能直接向DS中送立即数。改为:MOV AX,0100H
MOV DS,AX
02)源操作数和目的操作数的类型不同。改为:MOV BP,AX
03)立即数不能用于交换指令
04)直接寻址的输出指令中,端口号只能在O~FFH范围内
07)SI、DI不能一起用。改为:MOV AX,[BX + DI]
09)源操作数和目的操作数的类型不同。改为:AND AX,BX
11)MOV指令不能源操作数和目的操作数都是寄存器。改为:MOV BX,[SI];源操作数为寄存器,目的操作数是存储器。或MOV [BX],SI;源操作数为存储器,目的操作数是寄存器。
12)MOV的操作数不能是CS
-
执行下列程序段,指出此程序段功能。
(1)MOV CX,10;
LEA SI,First;//将数据段First的地址偏移量送SI
LEA DI,Second;//将数据段Secnd的地址偏移量送DI
REP MOVSB;//将源串一字节传送到目地串,并自动修改指针值
功能:将源字符串First的10个字节移送至目标字符串Second
(2)CLD;
LEA DI,ES:[0404H];
MOV CX,0080H;
XOR AX,AX;
REP STOSW;
功能:将内存中从0404H单元开始的128个字单元清零
另:1° 分别填写下列操作数的寻址方式和物理地址
设(DS)= 2000H,(ES)= 2100H,(SS)= 1500H,(SI)= 00A0H,(BX)= 0100H,(BP)= 0010H。数据段中变量名VAL的偏移量地址值为0050H,试指出下列源操作数字段的寻址方式是什么,其物理地址值是多少或者有没有物理地址?
(1)MOV AX,OABH
(2)MOV AX,[100H]
(3)MOV AX,ES:[BX]
(4)MOV AX,VAL[BX]
(5)MOV AX,[BX][SI]
解:
1) 立即寻址, 没有物理地址
2) 直接寻址, 物理地址= 10 × 段地址(DS)+ 偏移量(EA)
= 10 × 2000H + 100H = 20100H
3)寄存器间接寻址, 物理地址 = 10 × 段地址(ES)+ 偏移量(EA)
= 10 × 2100H + 0100H = 21100H
4)寄存器相对寻址, 物理地址= 10 × 段地址(DS)+ 偏移量(EA)
= 10 × 2000H + 0050H = 20150H
5)基址变址寻址, 物理地址 = 10 × 段地址(DS)+ 偏移量(EA)
=10 × 2000H + 0100H + 00A0H = 201A0H
2°分别填写下列操作数的值
已知DS= 091DH,AX= 1234H,BX= 0024H,CX= 5678H,SI= 0012H,DI= 0032H,(09226H)= 00F6H,(09228H)= 1E40H,(1E4F6H)= 091DH,试求单独执行下列指令后的结果。
1) MOV CL,20H[BX][SI]; (CL)= 00F6H
2) LEA BX,20H[BX][SI]; (BX)= 0056H
3) LDS SI,[BX][DI]; [SI] = 00F6H
4) MOV [SI],BX; [SI] = 0024H
5) XCHG CX,32H[BX]; (CX) = 00F6H
第四章P195
-
设下列指令语句中的标识符均为字变量,请指出哪些指令是非法的,并指出其错误之处。.
(02)MOV AX,WORD1[DX] DX不能作为基址寄存器
(03)MOV WORD1,WORD2 源操作数和目的操作数不能均在存储器
(04)MOV SWORD,DS √
(07)MOV AX,WORD1+WORD2 两个变量不能直接相加
(10)MOV SI,OFFSET WORD2[BX] OFFSET后应跟变量或标号
-
试编制一程序,统计出某数组中相邻两数之间符号变化的次数。
DATA SEGMENT
N = 20H
ARRAY DB 20 DUP(?)
NUM DB 0
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
STARTUP:LEA SI,ARRAY;SI指向数组首址
MOV AL,[SI] ;取第一个字符
MOV BL,0 ;结果计数器清零
MOV CX,19 ;置循环计数器
AGAIN: INC SI ;指向下一数组单元
XOR AL,[SI] ;两个数按位进行逻辑异或操作
JNS NEXT ;符号位非负表明两数符号相同,跳过不计数
INC BL ;结果计数器BL加1
NEXT: MOV AL,[SI] ;当前数组元素送AL
LOOP AGAIN
MOV NUM,BL ;保存结果
MOV AH,4CH ;返回DOS
INT 21H
CODE ENDS
END START
- 试编制一程序,把20个字节的数组分成正数组和负数组,并分别计算两个数组中数据的个数。
解:程序如下:
DATA SEGMENT
BUF DB 12H,34H, 56H,……
N=20
BUF1 DB N DUP(0),0
BUF2 DB N DUP(?),0
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV DX,DATA
MOV DS,DX
LEA SI,BUF
LEA DI,BUF1
LEA BX,BUF2
MOV CX,N
LOP: MOV AL,[SI]
INC SI
CMP AL,O
JGE PLUS
MOV [BX],AL
INC BUF2+N
INC BX
JMP NEXT
PLUS:MOV [DI],AL
INC BUF1+N
INC DI
NEXT:LOOP LOP
MOV AH,4CH
INT 21H
CODE ENDS
END START
微型计算机原理(第六版)姚向华编著(转载请注明出处—https://www.cnblogs.com/qingl)