43. 下列变量各占多少字节? 〈1〉ALPHA DW 25H,36H 〈2〉BETA DB 4 DUP(?)
〈3〉GAMMA DD 10 DUP(1250H,12345678H) 〈4〉COUNT DB 5 DUP(4 DUP(3,2,’ABC’)) 解:〈1〉 2×2=4 〈2〉 1×4=4 〈3〉 4×10×2=80
〈4〉 1×5×4×(2+3)=100
44. 下列指令各完成什么功能?
〈1〉MOV AX,00FFH AND 122H+2233H 〈2〉MOV AL,15 GE 1111B
〈3〉MOV AX,4500H OR 0035 AND 00FFH 〈4〉MOV AH,0FFH LE 255+6/5 〈5〉OR AL,50 MOD 4+20
解:〈1〉AX = (0000 0000 1111 1111 & 0010 0011 0101 0101) = 0055H 〈2〉AL = FFH
〈3〉AX = (4500H | 0023H & 00FFH) = 4523H ――注意0035=23H 〈4〉AH = FFH
〈5〉等效为 “OR AL, 16H” 即将AL的 D4D2D1置1, 其它位不变
45. 假设程序中的数据定义如下: LNAME
DB 30 DUP(?)
CODE_LIST DB 1,7,8,3,2 ADDRESS DB 30 DUP(?)
〈1〉用一条MOV指令将LNAME的偏移地址放入BX。
〈2〉 用一条指令将CODE_LIST的头两个字节(低字节在前,高字节在后)内容放入SI。 〈3〉写一条伪指令使CODE_LENTH的值等于CODE_LIST域的实际长度。 解:〈1〉MOV BX, OFFSET LNAME 〈2〉MOV SI, WORD PTR CODE_LIST
〈3〉CODE_LENTH EQU ADDRESS – CODE_LIST ;EQU也可以写成等号。题意没有规定CODE_LENTH是符号还是变量,故还可以写成:
CODE_LENTH DB ADDRESS - CODE_LIST ;限制其数值小于256
46. 试按下列要求分别编写程序段: 〈1〉将寄存器AL中高低四位互换。
〈2〉由寄存器AX,BX组成一个32位带符号数(AX中存放高16位),试求这个数的相反
数。
〈3〉用一条指令把CX中的整数转变为奇数(如原来已是奇数,则CX不变;如原来是偶数,
则CX+1形成奇数)。 解:
(1) MOV CL,4 ROL AL,CL ; 或ROR AL,CL (2) ①若用NEG指令求相反数,则可: NEG BX ADC AX,0 ; 加上可能产生的进位CF NEG AX ; 0 –(AX+CF)=0–AX - CF
②若理解求相反数为连符号位带数值位取反再末位加1 ,则可: NOT AX NOT BX ADD BX,1 ADC AX,0 ; 这种算法最后CF和NEG的相反 (3) OR
47. 指令AND AX,1234H AND 5678H中,两个AND操作有什么区别? 解:前一个AND 是 运算指令,在执行指令时完成;AND AX,1230H
后一个 AND 是汇编运算中的逻辑运算, 在汇编时完成。1234H AND 5678H = 1230H
49. 编写一个完整的程序,要求把数据段DSEG中的双字数X和附加段ESEG中的双字数Y相加,结果存放在DSEG中的SUM中,代码段为CSEG。
解:DSEG SEGMENT X DD 12345678H ;双字 SUM DD ? ;双字 DSEG ENDS
ESEG SEGMENT Y DD 34567890H ;双字 ESEG ENDS
STACK SEGMENT STACK DB 100 DUP(?) STACK ENDS CSEG SEGMENT ASSUME CS:CSEG, DS:DSEG, ES:ESEG,SS:STACK
MOV AX, DSEG MOV DS, AX MOV AX, ESEG MOV ES, AX MOV AX,WORD PTR X ;转类型引用,一定要写WORD PTR ADD AX, WORD PTR ES:Y; 一定要写ES:,否则默认DS: MOV WORD PTR SUM, AX; 转类型存储,一定要写WORD PTR MOV AX,WORD PTR X+2 ; 地址是按字节计算,所以+2才指向高位字, ADC AX,WORD PTR ES:Y+2 ; 带低位字的进位加
CX,1
MOV WORD PTR SUM+2, AX; 最后的进位没有考虑 MOV AH,4CH INT 21H CSEG ENDS
52. 设字节变量X为带符号整数,试按下面要求编写出程序: 〈1〉如果X的绝对值大于5,将变量FX赋值为零; 〈2〉如果X的绝对值不大于5,将变量FX赋值为1-X。
解: X DB -5
FX DB ?
法 一:
MOV FX, 0; 先赋一个值0,使后面的分支简单
CMP X, 5 JG DONE; 带符号数必须用JG、JL,不能用无符号数的JA、JB CMP X, -5; 汇编语言源程序中可以直接用-5这种形式 JL DONE MOV AL, 1 SUB AL, X MOV FX, AL DONE: INT 3
法 二: MOV FX, 0 MOV AL, X; 取到AL中变换,以免破坏X。而且在AL中运算还快 AND AL, 0FFH ;区分正负数 JNS L1 NEG AL ; 负数变绝对值,正数就不能做这条指令
L1: CMP AL, 5 ; 至此X已经是绝对值,可以看成无符号数 JA DONE; 若用了JG,从概念上稍错一点 MOV AH, 1 SUB AH, X; MOV FX, AH DONE: INT 3
55. 编写程序,将AX的内容转换为相应十六进制数的ASCII码,存入首地址为MEM的四个存储单元中,低位在前,高位在后。
解:DATA SEGMENT MEM DB 4 DUP (?) DATA ENDS
STACK SEGMENT STACK DB 100 DUP(?) STACK ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA, SS:STACK
START: MOV AX,DATA MOV DS,AX MOV CX,4 MOV SI, 0 L1: PUSH CX MOV BX,0FH AND BX,AX OR BL,30H CMP BL,39H JBE L2 ADD BL,7 L2: MOV MEM[SI],BL INC SI MOV CL,4 SHR AX,CL POP CX LOOP L1 MOV AH,4CH INT 21H CODE ENDS END START
56. 指出下列容量的静态存储器芯片各有几条地址线和数据线?若要分别组成一个16KB的存储器系统,各需要几片?
(1) 1K×4bit (2) 256×8bit (3) 2K×8bit (4) 4096×1bit
解:地址线 数据线 片数 (16K) (8b)
(1) 10 4 32 = 16×(1K) × 2 × (4b) (2) 8 8 64 = 16×4×(256) × 1B (3) 11 8 8 = 8×(2K) × 1B
(4) 12 1 32 = 4×(4K) × 8×(1b)
常见问题:
第5次作业中,46(1)有一部分同学直接写的是 ROL AL,4 但是对于ROL指令立即数只能为1,必须借助CL 。参见教材87页