1、 1 1-1 0AH, 40H, 4EH, 50H, 5DH, 64H, 7DH, FFH 1-2 44, 100, 213, 256, 888, 1278, 3245 1-3 十进制数 原码 补码 十进制数 原码 补码 18 12 12 928 03A0 03A0 18 92 EE 928 83A0 FC60 30 1E 1E 8796 225C 225C 30 9E E2 8796 A25C DDA4 347 015B 015B 65530 0000FFFA 0000FFFA 347 815B FEA5 65530 8000FFFA FFFF0006 1-4 用十进制数写出下列补码表示的机
2、器数的真值: 27, 113, 128, 8, 14717, 31467, 27824, 12478 1-5 溢出; 溢出 无溢出 无溢出 1-6 00AAH, 803BH, FF88H。 1-7 将下列各组二进制数进行“与”运算。 (1)DAH 99H (2)BAH 56H (3)95H FFH ( 1) 11011010 10011001 解: 11011010 1001100110011000 11011010 10011001=10011000 ( 2) 10111100 01010110 解: 10111100 0101011000010100 10111100 01010110=0
3、0010100 ( 3) 10010101 1111111 解: 10010101 1111111110010101 10010101 11111111=10010101 1-8 将下列各组二进制数进行“或”运算。 (1)DAH 99H (2)F0H 5AH (3)C6H 45H ( 1) 11011010 10011001 解: 110110101001100111011011 11011010 10011001=11011011 ( 2) 11110000 01011010 解: 11110000 0101101011111010 11110000 01011010=11111010 (
4、3) 11000110 00000000 解: 2 110001100000000011000110 11000110 00000000=11000110 1-9 1000011001011010=11011100 1011110010101010=00010110 1101101010011001=01000011 1-10 十进制数 压缩 BCD数 非压缩 BCD数 ASCII码 38 38H 0308H 3338H 97 97H 0907H 3937H 105 105H 010005H 313035H 255 255H 020505H 323535H 483 483H 040803H 3
5、43833H 764 764H 070604H 373634H 1000 1000H 01000000H 31303030H 1025 1025H 01000205H 31303235H 1-11 43, 126, 8192, 30116 1-12 A8H 1-17 0914H: 00F2H, 09232H 1-18 DS=2F5FH时,物理地址变为 37820H。不同段地址的数据段示 意图如下图 2所示。 2.3 BX=5566H AX=3344H CX=5566H DX=1122H 堆栈存储器的逻辑地址、堆栈指示器的指向及栈区的内容如下图所示。 2.4 0036H, 003AH 2.5 程
6、 序 段 AX MOV AX, 0 0000 DEC AX FFFF ADD AX, 7FFFH 7FFE ADC AX, 1 8000 NEG AX 8000 OR AX, 3FDFH BFDF AND AX, 0EBEDH ABCD XCHG AH, AL CDAB SAL AX, 1 9B56 RCL AX, 1 36AD 2.6。 指 令 存储器操作数的逻辑地址 注 释 3 SUB BP, AL 0FC0H: 0000H 段地址在 SS MOV BX, BH 1000H: 0000H MOV DI, DL 1000H: 0000H MOV ES: SI, BL 2000H: 0000H
7、 ADD BP+500H, AH 0FC0H: 0500H 段地址在 SS SUB SI300H, AL 1000H: FD00H 300H=FD00H MOV DI+1000H, DL 1000H: 1000H MOV BX8, CL 1000H: FFF8H 8=FFF8H MOV ES: DI+1000H, CH 2000H: 1000H MOV BP+SI, DH 0FC0H: 0000H 段地址在 SS MOV BX+DI, DL 1000H: 0000H 2.7 0000H, 0880H, 0081H, 0800H 2.8 NEG AX, AND AX,7FFFH 2.9 ( 1)
8、 MOV CL, 4 SHL AX, CL SHL BL, CL MOV AL, BL SHR DH, CL OR AL, DH ( 2) XOR CX, 0FF0H ( 3) MOV AL, BX MOV AH, 0 ADD AL, BX+1 ADC AH, 0 ADD AL, 2 BX ADC AH, 0 ( 4)方法 1: MOV AL, BX XCHG AL, BX+3 MOV BX, AL MOV AL, 1BX XCHG AL, 2BX MOV 1BX, AL 方法 2: MOV AX, BX XCHG AH, 2BX XCHG AL, 3BX MOV BX, AX ( 5) XC
9、HG BH, BL MOV AL, BL AND BL, 0FH MOV CL, 4 SHR AL, CL MOV DL, BH AND DL, 0FH SHR BH, CL MOV CL, BH ( 6) MOV AH, 0 ;将 AL中的无符号数扩展成 16位 MOV CL, 2 SHL AX, CL ;将 AX乘以 4 MOV DX, AX SHL AX, CL ;将 AX再乘以 4 ADD AX, DX 2.10 数据的存储形式: 4 ( 2) 变量名 偏移地址 (H) 变量的值 (H) S1 0000 00 S2 0006 31 NB 000B 02 NW 000E 0078 P 0
10、012 FFFF ( 3) 程 序 段 目的寄存器的值 源操作数的寻址方式 MOV BX, OFFSET S1+3 0003 立即寻址 MOV SI, OFFSET S2 0006 立即寻址 MOV CL, COUNT 0B 立即寻址 MOV BP, NW+2 FF00 直接寻址 MOV DX, WORD PTR NB 0202 直接寻址 MOV AL, SI+3 34 变址寻址 MOV AH, SI+BX+1 35 基址变址寻址 MOV CH, BYTE PTR NW+3 FF 直接寻址 ( 4)改正下列程序段中不正确指令的错误: a. MOV AX, S1 b. MOV BP, OFFSE
11、T S2 MOV CL, BP c. MOV SI, OFFSET NB MOV SI, + d. MOV DL, NW+2 e. MOV DI, CH f. MOV BX, OFFSET S1 5 MOV DH, BX+3 g. INC COUNT h. MOV NB, S2 i. MOV AX, BX+S1 j. ADD AX, DX+NW 解: a. MOV AX, WORD PTR S1 b. MOV BP, OFFSET S2 MOV CL, DS: BP c. MOV SI, OFFSET NB MOV BYTE PTR SI, + d. MOV DL, BYTE PTR NW+2
12、 e. XCHG CH, CL MOV CH, 0 MOV DI, CX f. MOV BX, OFFSET S1 MOV DH, BX+3 g. 错误指令。在操作数中直接书写数值表达式 COUNT+1 h. MOV AL, S2 MOV NB, AL i. MOV AX, WORD PTR S1BX j ADD AX, DI+NW 2.11 stack segment stack stack dw 32 dup(0) stack ends data segment FIRST DD 0A46E5F90H SECOND DB5 DUP(0) data ends code segment sta
13、rt proc far assume ss: stack, cs: code, ds: data push ds sub ax, ax push ax mov ax, data mov ds, ax MOV AX, WORD PTR FIRST MOV DX, WORD PTR FIRST+2 MOV SECOND+4, 0 SHL AX, 1 RCL DX, 1 RCL SECOND+4, 1 SHL AX, 1 RCL DX, 1 RCL SECOND +4, 1 MOV WRORD PTR SECOND, AX MOV WORD PTR SECOND +2, DX ret start e
14、ndp code ends end start 2.12 stack segment stack stack dw 32 dup(0) stack ends data segment FIRST DD 0A46E5F90H THIRD DB 4 DUP(0) 6 data ends code segment start proc far assume ss: stack, cs: code, ds: data push ds sub ax, ax push ax mov ax, data mov ds, ax MOV AX, WORD PTR FIRST MOV DX, WORD PTR FI
15、RST+2 SAR DX, 1 RCR AX, 1 SAR DX, 1 RCR AX, 1 MOV WORD PTR THIRD, AX MOV WORD PTR THIRD+2, DX ret start endp code ends end start 2.13 stack segment stack stack dw 32 dup(0) stack ends data segment FIRST DD 0A46E5F90H FORTH DB 4 DUP(0) data ends code segment start proc far assume ss: stack, cs: code,
16、 ds: data push ds sub ax, ax push ax mov ax, data mov ds, ax MOV AX, WORD PTR FIRST NOT AX MOV WORD PTR FORTH, AX MOV AX, WORD PTR FIRST+2 NOT AX MOV WORD PTR FIRST+2, AX ADD WORD PTR FORTH, 1 ADC WORD PTR FORTH+2, 0 ret start endp code ends end start 2.14 数据段的内存映象图: 7 该程序的功能是将字节变量 BUF中的两位 BCD数以十六进制
17、数形式显示出来。具体显示是在下一行的行首显示( BUF)=78H。 3-1 1. AX=0048H, AX=0702H 2. AX=0059H, AX=0411H, AX=0107H, DL=04H 3. AX=0011H, AX=0107H 4 AX=005AH, AX=0900H, AX=0908H 5. AL=62H 6. AX=0248H 3-2 stack segment stack stack dw 32 dup(0) stack ends data segment BVAR DB 99H data ends code segment begin proc far assume s
18、s: stack , cs: code, ds: data push ds sub ax, ax push ax mov ax, data mov ds, ax MOV AL, BVAR MOV CL, 4 SHR AL, CL MOV AH, 10 MUL AH AND BVAR, 0FH ADD BVAR, AL ret begin endp code ends end begin 先将 2位压缩 BCD数转换为非压缩 BCD数,再用 AAD指令将非压缩 BCD数转换为二进制数: MOV AL, BVAR 8 MOV AH, AL MOV CL, 4 SHR AH, CL AND AL,
19、0FH AAD MOV BVAR, AL 3-3 stack segment stack stack dw 32 dup(0) stack ends data segment W1 DW 0807H W2 DW 0609H B3 DB 2 DUP(0) data ends code segment begin proc far assume ss: stack, cs: code, ds: data push ds sub ax, ax push ax mov ax, data mov ds, ax MOV AX, W1 ; AX=0807H SUB AL,BYTE PTR W2 ; AL=F
20、EH, CF=1 AAS ; AL=08H, AH=07H MOV B3, AL MOV AL, AH SUB AL,W2+1 MOV B3+1,AL ret begin endp code ends end begin 还可以用 AAD 指令将两个非压缩 BCD 数转换为二进制数,相减后再用 AAM 将差转换为非压缩 BCD 数: MOV AX, W2 AAD MOV DX,AX MOV AX,W1 AAD SUB AX,DX AAM MOV BYTE PTR B3,AX 3-4 stack segment stack stack dw 32 dup(0) stack ends data s
21、egment D1 DD 06070809H D2 DD 04050607H OBF DB 6 DUP(0) data ends code segment begin proc far assume ss: stack, cs: code, ds: data push ds sub ax, ax push ax mov ax, data mov ds, ax 9 MOV SI, 0 MOV DI,OFFSET OBF+5 MOV BYTE PTRDI,$ MOV CX,4 XOR AH,AH AGAIN: MOV AL, BYTE PTR D1SI ADD AL, BYTE PTR D2SI
22、ADD AL,AH MOV AH, 0 AAA ADD AL,30H DEC DI MOV DI,AL INC SI LOOP AGAIN AND AH,AH JZ N5 DEC DI MOV BYTE PTRDI,1 N5: MOV DX,DI MOV AH,9 INT 21H ret begin endp code ends end begin 3-5 stack segment stack stack dw 32 dup(0) stack ends data segment W1 DW 8931H W2 DW 5678H OBF DB 6 DUP(0) data ends code se
23、gment begin proc far assume ss: stack, cs: code, ds: data push ds sub ax, ax push ax mov ax, data mov ds, ax MOV DI,0 MOV AL, BYTE PTR W1 ; AL=31H ADD AL, BYTE PTR W2 ; AL=A9H, CF=0, AF=0 DAA ; AL=09H, CF=1 MOV AH, AL MOV AL, BYTE PTR W1+1 ; AL=89H ADC AL, BYTE PTR W2+1 ; AL=E0H, CF=0, AF=1 DAA ; AL
24、=46H, CF=1 PUSHF MOV DI OFFSET OBF+5 MOV BYTE PTRDI, $ MOV CL,4 XCHG AH,AL AGAIN: MOV DL,0FH AND DL,AL ADD DL,30H DEC DI MOV DI,DL 10 SHR AX,CL AND AX,AX JNZ AGAIN POPF JNC OUTPUT DEC DI MOV BYTE PTRDI, 1 OUTPUT: MOV DX,DI MOV AH,9 INT 21H begin endp code ends end begin 3-6 stack segment stack stack
25、 dw 32 dup(0) stack ends data segment BVAR DB 99H OBUF DB 4 DUP(0) data ends code segment begin proc far assume ss: stack, cs: code, ds: data push ds sub ax, ax push ax mov ax, data mov ds, ax MOV AL ,BVAR ;二进制数送 AL MOV AH, 0 ;二进制数扩展为 16位(无符号数扩展) MOV DL, 100 DIV DL ADD AL, 30H ;将百位变为 ASCII码 MOV OBUF
26、, AL ; 存百位 MOV AL, AH ;将十位和个位的二进制数即余数送 AL AAM ;将 AL中的二进制数转换为 ASCII BCD数 ADD AX, 3030H ;将 AX中的 ASCII BCD数变为 ASCII码 MOV OBUF+1, AH MOV OBUF+2, AL MOV OBUF+3, $ MOV DX, OFFSET OBUF MOV AH, 9 INT 21H ret begin endp code ends end begin 将 8位二进制数转换为十进制数也可以用除 10取余法实现。转换程序段如下: MOV AL, BVAR XOR AH, AH ;将 8位二进制数扩展为 16位 (无符号数扩展 ) MOV DL, 10 DIV DL ADD AH, 30H ;将第一个余数即个位变为 ASCII码 MOV OBUF+2, AH XOR AH, AH ;将 AL中的二进制数扩展为 16位 DIV DL ADD AX, 3030H ; AH为十位, AL为百位 MOV WORD PTR OBUF, AX MOV OBUF+3, $ 还可以用左移二进制数的方法将二进制数转换为十进制数: