MOV SI, SEG CONAME MOV DS, SI MOV ES, SI
LEA SI, CONAME LEA DI, PRLINE REP MOVSB (2) MOV CX, 20 STD
MOV SI, SEG CONAME MOV DS, SI MOV ES, SI
LEA SI, CONAME ADD SI, 20-1 LEA DI, PRLINE ADD DI, 20-1 REP MOVSB
(3) MOV AX, WORD PTR CONAME+3-1 (4) MOV WORD PTR PRLINE +5, AX
(5) MOV AL, ? ‘ ;空格的ASCII码送AL寄存器 CLD
MOV DI, SEG CONAME MOV ES, DI
LEA DI, CONAME REPNE SCASB JNE NEXT DEC DI
MOV BX, DI NEXT: ┇
3.30 MOV CX, 18 MOV AL, ?&‘ CLD
MOV DI, SEG STRING MOV ES, DI
LEA DI, STRING REPNE SCASB JNE NEXT DEC DI
MOV ES:BYTE PTR [DI], ? ‘ ;送空格符 NEXT: ┇
3.31答:公共的程序段如下: MOV DI, DS MOV ES, DI (1) MOV CX, 132
MOV AL., ? ‘ ;空格的ASCII码送AL寄存器
CLD
LEA DI, PRINT_LINE REP STOSB (2) MOV CX, 9 MOV AL., ?-‘ CLD
LEA DI, STUDENT_ ADDR REPNE SCASB JNE NO_DASH DEC DI
NO_DASH: ┇ (3) MOV CX, 9 MOV AL., ?-‘ STD
LEA DI, STUDENT_ ADDR ADD DI, 9-1 REPNE SCASB JNE NO_DASH INC DI
NO_DASH: ┇ (4) MOV CX, 30
MOV AL, ? ‘ ;空格的ASCII码送AL寄存器 CLD
LEA DI, STUDENT_NAME REPE SCASB JNE NEXT MOV CX, 30
MOV AL, ?*‘ ;―*‖的ASCII码送AL寄存器 LEA DI, STUDENT_NAME REP STOSB NEXT: ┇
(5) MOV CX, 30 CLD
LEA SI, STUDENT_NAME LEA DI, PRINT_LINE REP MOVSB MOV CX, 9 STD
LEA SI, STUDENT_ADDR+9-1 LEA DI, PRINT_LINE+132-1 REP MOVSB 3.32 MOV CX, 5 CLD
MOV DI, SEG OLDS
MOV DS, DI MOV ES, DI LEA SI, OLDS LEA DI, NEWS REPE CMPSB JNE NEW_LESS ┇
NEW_LESS: ┇
3.33 (1) CMP DX, CX JA EXCEED (2) CMP BX, AX JG EXCEED (3) JCXZ ZERO (4) CMP BX, AX JO OVERFLOW
(5) CMP BX, AX JLE EQ_SMA (6) CMP DX, CX JBE EQ_SMA 3.34 (1) 转向L1 (2) 转向L1 (3) 转向L2
(4) 转向L5 ;因为加法指令后AX中已经是6FF3H (5) 转向L5 ;因为加法指令后AX中已经是4A14H
3.35 (1) JNB、JBE、JNL、JLE (2) JNB、JBE、JNL、JLE (3) JNB、JNBE、JL、JLE (4) JNB、JNBE、JNL、JNLE (5) JNB、JNBE、JL、JLE (6) JB、JBE、JL、JLE (7) JB、JBE、JNL、JNLE (8) JNB、JNBE、JL、JLE
3.36 答:此程序段判断p*2>q,则使(AX)=1后退出;p*2≤q,则使(AX)=2后退出。 3.37程序段如下: MOV AL, STATUS
AND AL, 00010101B ;只保留第1、3、5位 JZ ROUTINE_4 ;3位全为0转ROUTINE_4 JPE ROUTINE_2 ;两位为1转ROUTINE_2 CMP AL, 00010101B
JZ ROUTINE_1 ;3位全为1转ROUTINE_1 ROUTINE_3: ┇ ;仅一位为1执行ROUTINE_3 JMP EXIT
ROUTINE_1: ┇ JMP EXIT
ROUTINE_2: ┇ JMP EXIT
ROUTINE_4: ┇ EXIT: INT 20H
3.38 (1) (AX)=5H,(BX)=10H,(CX)=0H,(DX)=0H (2) (AX)=2H,(BX)=4H,(CX)=3H,(DX)=1H (3) (AX)=3H,(BX)=7H,(CX)=2H,(DX)=0H 3.40 (1) PA=(DS)*10H+EA=00100H+00001000H+00002000H=00003100H (2) PA=(DS)*10H+EA=00100H+00001000H+2*00002000H=00005100H
(3) PA=(DS)*10H+EA=00100H+00002000H+4*00001000H+1000H=00007100H 3.4 (1) 目的地址为DS:2000H,内容依次为:56H,0F4H,23H和98H (2) 目的地址为DS:348CH,内容依次为:91H,34H,0F2H和01H (3) 目的操作数为EBX寄存器,(EBX)=4CA26D92H 3.42 (1) PUSH AX ;将(AX)压入堆栈
(2) POP ESI ;将堆栈中的双字弹出到ESI寄存器中
(3) PUSH [BX] ;将((BX))对应存储单元中的字压入堆栈 (4) PUSHAD ;32位通用寄存器依次进栈
(5) POP DS ;将堆栈中的字弹出到DS寄存器中 (6) PUSH 4 ;将立即数4以字的方式压入堆栈
3.43 (1) MOV EAX,299FF94H ADD EAX,34FFFFH ;(EAX)= 2CEFF93H (2) MOV EBX,40000000 SUB EBX,1500000 ;(EBX)= 3EB00000H (3) MOV EAX,39393834H AND EAX,0F0F0F0FH ;(EAX)= 09090804H (4) MOV EDX,9FE35DH XOR EDX,0F0F0F0H ;(EDX)= 6F13ADH 3.44 (1) MOV BX,-12 MOVSX EBX,BX ;(EBX)= 0FFFF FFF4H (2) MOV CL,-8 MOVSX EDX,CL ;(EDX)= 0FFFF FFF8H (3) MOV AH,7 MOVZX ECX,AH ;(ECX)= 0000 0007H (4) MOV AX,99H MOVZX EBX,AX ;(EBX)= 0000 0099H 3.45 MOV ECX,307 F455H
BSF EAX,ECX ;(EAX)= 0D BSR EBX,ECX ;(EBX)= 25D 3.46 MOV BX,98H
BSF AX,BX ;(AX)= 3D BSR DX,BX ;(DX)= 7D
3.47 MOV EDI,0 也可为: MOV EDI,ECX ADD EDI,ECX ADD EDI,EDX ADD EDI,EDX ADD EDI,ESI ADD EDI,ESI 3.48 (BX)←(DX)*100H 3.49 MOV AL,BL
MOV AH,0 ;假定为无符号数,否则用CBW指令即可 DIV CL
MOV AH,0 SHL AX,1 MOV DX,AX
3.50答:JMP DI是转移到以(DI)内容为偏移地址的单元去执行指令;JMP [DI]是转移到 以(DI)间接寻址的内存单元内容为偏移地址的单元去执行指令。 3.51 JMP BEGIN UP DB 0 DOWN DB 0
TABLE DB 100H DUP (?) ;数组 BEGIN:
MOV CX,100H MOV BX,-1 MOV SI,0 MOV DI,0 L1:INC BX
CMP TABLE[BX],42H JA L2 JB L3
JMP L4 L2:INC SI JMP L4 L3:INC DI L4:LOOP L1 MOV UP,SI MOV DOWN,DI
第四章
4.1 (1) MOV AH, BX ;寄存器类型不匹配 (2) MOV [BX], [SI] ;不能都是存储器操作数 (3) MOV AX, [SI][DI] ;[SI]和[DI]不能一起使用
(4) MOV MYDAT [BX][SI], ES:AX ;AX寄存器不能使用段超越 (5) MOV BYTE PTR [BX], 1000 ;1000超过了一个字节的范围
(6) MOV BX, OFFSET MYDAT [SI] ;MYDAT [SI]已经是偏移地址,不能再使用OFFSET (7) MOV CS, AX ;CS不能用作目的寄存器
(8) MOV ECX, AX ;两个操作数的数据类型不同
4.2 (1) CMP 15, BX ;错,立即数不能作为目的操作数 (2) CMP OP1, 25 (3) CMP OP1, OP2 ;错,不能都是存储器操作数
(4) CMP AX, OP1 ;错,类型不匹配,应为CMP ax, word ptr op1 4.3 (1) MOV BP, AL ;错,寄存器类型不匹配 (2) MOV WORD_OP [BX+4*3][DI], SP
(3) MOV WORD_OP1, WORD_OP2 ;错,不能都是存储器操作数 (4) MOV AX, WORD_OP1[DX] ;错,DX不能用于存储器寻址
(5) MOV SAVE_WORD, DS (6) MOV SP, SS:DATA_WORD [BX][SI] (7) MOV [BX][SI], 2 ;错,[BX][SI]未指出数据类型 (8) MOV AX, WORD_OP1+WORD_OP2 (9) MOV AX, WORD_OP1-WORD_OP2+100
(10) MOV WORD_OP1, WORD_OP1-WORD_OP2
4.4 (1) ADD VAR1, VAR2 ;不能都是存储器操作数 (2) SUB AL, VAR1 ;数据类型不匹配 (3) JMP LAB [SI] ;LAB是标号而不是变量名,后面不能加[SI]
(4) JNZ VAR1 ;VAR1是变量而不是标号 (5) JMP NEAR LAB ;应使用NEAR PTR 4.5 画图说明下列语句所分配的存储空间及初始化的数据值。 (1) BYTE_VAR DB ?BYTE‘,12,-12H,3 DUP(0,?,2 DUP(1,2),?) (2) WORD_VAR DW 5 DUP(0,1,2),?,-5,?BY‘,?TE‘,256H 答:答案如下图所示。
4.6 试列出各种方法,使汇编程序把5150H存入一个存储器字中(如:DW 5150H)。 4.5题答案 42H 59H 54H 45H 0DH