习题一
1.1 试分别将下列二进制数真值用补码表示(8位二进制数)。
(1)+01101011 (2)-01011100 (3)-00111111 (4)+01111011
1.2. 试分别将下列补码表示的二进制数转换为相应的十进制数真值。
(1)11111110 (2)01100011 (3)10001100 (4)11000100
1.3. 试完成下列数制间的转换。
(1)十进制数转换为8位二进制数
34,28,100,127,89,57
(2)无符号二进制数转换为十进制数
01011101,11100111,00101110,10101100,00011100,11010101 (3)十进制数转换为十六进制数
79,300,48,19,133,243
(4)八进制数转换为十六进制数
234,112,23,76,36,222
1.4. 试分别完成下列补码表示的二进制数运算,并将结果转换为十进制数真值。
(1)01101100+10001110 (2)11100110-10101100 (3)01110100-00011101
(4)10001110-00110011 (5)11111111-01111111 (6)10000000+01110011
1.5. 试分别完成下列各十六进制数的加减运算,结果用十六进制数表示。
(1)3E40+AB54 (2)1000+F300 (3)8799-6DE4 (4)DE4C-A0E4
1.6. 设有二进制数10111000,若将该数分别看作是无符号数、原码表示的带符号数和补码表示的带符号数,它对应的十进制数真值分别是多少?
1.7. 要表示无符号十进制数1000、10000和100000,至少分别需要多少位二进制数?
1.8. 由键盘输入的字符一般以其ASCII码形式来表示。当从键盘输入十六进制数的16个数符(0~9和A~F)时,如何将它们转换为对应的四位二进制数0000~1111?
习题二
2.1 如何理解微处理器、微型计算机和微型计算机系统三个概念?
2.2 试说明Intel 8086/8088 CPU采用了什么结构使得其与8位及8位以下CPU相比具有更高的指令执行效率?
2.3 Intel 8086/8088 CPU包含哪几个组成部分?它们各自的功能是什么?
2.4 Intel 8086/8088 CPU中有哪些寄存器?它们的用途是什么?
2.5 Intel 8086/8088 CPU中标志寄存器各位都有什么含义?
2.6 Intel 8086/8088 CPU中的寄存器都是16位的,那么它是怎么实现对20位物理地址寻址的?
2.7 在IBM PC微型计算机上,分别进行以下8位二进制数的运算后,标志寄存器中OF、ZF、SF、CF的值分别为多少?
(1)10101011 + 01010101
(2)11011010 + 11101101
(3)01010101-00111110
(4)10110011-01100010
2.8有两个字数据12H 和AB12H 分别存放在存储器的10016H 和8BA00H 中,请图示它们在存储器中的存放情况。
2.9 在8086/8088中,某存储单元的逻辑地址如下,请算出它们的物理地址是多少? (1)4514H :017BH (2)F000H :0100H (3)2350H :1ABCH (4)10E0H :2020H
2.10 数据段中某个存储单元在(DS )= 095FH 时,物理地址是11820H ,那么当DS=0F5FH 时,物理地址为多少?
2.11 已知一条指令执行前,(CS )= 03FAH ,(IP )= 45A0H ,该指令的第1字节的物理地址是多少?
2.12 如图2.19所示,试写出地址为20021H 、20024H 、20026H 字节单元的内容,以及地址为20022H 、20024H 、20026H 的字单元内容。
20020H 20021H 20022H 20023H 20028H
20024H 20025H 20026H 20027H 图2.19
习题2.10图示
2.13 如图2.20所示,地址20000H 为数据段的段基址,那么逻辑地址为2000H :0020H 的存储单元的物理地址是多少?该地址的字内容是多少?
20000H
20020H 20021H
图2.20 习题2.11图示
2.14 IBM PC 微型计算机中某一个存储单元的物理地址是12345H ,试计算下列不同的逻辑地址表示:
(1)1234H :________H (2)_______H :0345H
2.15 设堆栈寄存器(SS )= 3E4BH ,程序中设置堆栈长度为200个字节,试计算出堆
栈底部字单元物理地址、堆栈指针SP初始值(即堆栈中没有数据时)和SP初始值指向的物理地址。
2.16 设(AX)= 1122H,(BX)= 3344H,(CX)= 5566H,(SP)= 2000H,试分析以下程序执行后AX、BX、CX、SP中的内容分别为多少?并画出堆栈变化的示意图。
:
PUSH AX
PUSH BX
PUSH CX
POP AX
POP CX
:
2.17 设(SP)= 0040H,如果用入栈指令存入5个数据,则SP为多少?若又用出栈指令取出2个数据,则SP为多少?
习题三
3.1 写出下列指令源操作数的寻址方式,并说明该操作数在哪个段?
(1)MOV AX,68H
(2)MOV AH,BL
(3)MOV AX,[BX]
(4)MOV AX,[SI]
(5)MOV AX,[5000H]
(6)MOV AL,BLOCK
(7)MOV BX,[BP + 5]
(8)MOV AX,CS:[1000H]
(9)MOV DS,AX
(10)MOV BL,BUF[SI]
(11)MOV AX,BUF[BX][SI]
(12)MOV AX,[BP – 10][DI]
(13)MOV AX,SS:[BX – 100][SI]
(14)MOV AX,AREY[BP][SI]
3.2 假设(DS)= 3000H,(ES)= 4100H,(SS)= 2000H,(SI)= 00A0H,(DI)= 2H,(BX)= 100H,(BP)= 10H,(BUF)= 2000H。试指出下列各指令中源操作数的寻址方式,若为存储器操作数,请计算其物理地址。
(1)MOV AL,[0ABCH]
(2)MOV AX,SI
(3)MOV AX,BUF
(4)MOV AX,BUF[BX]
(5)MOV AX,[BX]
(6)MOV AX,[SI]
(7)MOV AL,[BP]
(8)MOV AX,BUF[BP][SI]
(9)MOV AX,[BX – 40H]
(10)MOV AX,40H[SI]
(11)MOV AX,[BX – 40H][BX]
(12)MOV AX,[BP + 100H][SI]
(13)MOV AX,BUF[DI]
(14)MOV AX,ES:BUF[BX][DI]
3.3 已知(SS)= 0915H,(DS)= 0930H,(SI)= 0A0H,(DI)= 1C0H,(BX)= 80H,(BP)= 470H。现有一条指令“MOV AX,SRC”,若源操作数的物理地址为095C0H,试用四种不同的寻址方式改写此指令(要求上述每个已知条件至少要使用一次)。
3.4 指出下列指令是否合法。
(1)MOV AX,DL
(2)MOV [BX],5
(3)ADD AX,5
(4)MOV DS,1000H
(5)PUSH CH
(6)POP CS
(7)ADD ES,AX
(8)MOV SS,CS
(9)ADD [BP],DA_BYTE
(10)INC [BX]
(11)XCHG AX,1234H
(12)CMP AL,1919H
(13)SAR [BX][DI],1
(14)RCL DX,2
(15)MOV CS,AX
(16)SUB 5678H,BX
(17)NOT AX,CL
(18)MOV AX,[BX][BP]
(19)AND AX,10H[SI][DI]
(20)LEA DS,318H[SI]
3.5 已知(DS)= 091DH,(SS)= 1E4AH,(AX)= 1234H,(BX)= 0024H,(CX)= 5678H,(BP)= 0024H,(SI)= 0012H,(DI)= 0032H,(09226H)= 00F6H,(09228H)= 1E40H,(1E4F6H)= 091DH。下列各指令或程序段分别执行后的结果如何?
(1)MOV CL,20H[BX][SI]
(2)MOV [BP][DI],CX
(3)LEA BX,20H[BX][SI]
MOV AX,2[BX]
(4)LDS SI,[BX][DI]
MOV [SI],BX
(5)XCHG CX,32H[BX]
XCHG 20H[BX][SI],AX
3.6 如果TABLE为数据段中0032单元的符号地址,其中存放的内容为1234H,试问以下两条指令有什么区别?指令执行完后AX寄存器的内容是什么?
MOV AX,TABLE
LEA AX,TABLE
3.7 假设(CX)= 0FFFFH,那么下面指令单独执行后标志寄存器的CF、AF、ZF、SF 和OF分别是什么?(如无影响用“×”表示)
(1)SUB CX,0FFFFH
(2)MOV CX,BX
(3)INC CX
3.8读程序题。
(1)已知(DS)= 1234H,(SI)= 124H,(12464H)= 30ABH,(12484H)= 464H。
LEA SI,[SI]
MOV AX,[SI]
MOV [SI+22H],1200H
LDS SI,[SI+20H]
ADD AX,SI
上述程序段执行后:(DS)=________,(SI)=________,(AX)=________。
(2)已知(BX)= 6035H,(CX)= 0F0FH。
OR BH,CH
AND BL,CL
NEG BL
NOT BH
上述程序段执行后:(BH)=________,(BL)=________。
(3)已知(AX)= 0FF60H,CF = 1。
MOV DX,96
XOR DH,0FFH
SBB AX,DX
上述程序段执行后:(AX)=________,CF =________。
(4)已知(AX)= 0A65CH,(CX)= 0F002H。
ROL AX,CL
OR AH,CH
RCR AX,CL
上述程序段执行后:(AX)=________,CF =________。
(5)已知(AX)= 0FFAAH,CF = 1。
MOV CX,0ABH
OR CX,0FF00H
SUB AX,CX
上述程序段执行后:(AX)=________,CF =________。
3.9 试根据以下要求写出相应的汇编语言指令或指令序列。
(1)将DH的低三位清0,而其他位保持不变。
(2)将DI的高5位置1,而其他位保持不变。
(3)将AX的第0~3位置1,第7~9位取反,第13~15位清0,其他位保持不变。
(4)把标志寄存器中的IF位置1。
(5)由寄存器AX、DX组成一个32位带符号数(DX中存放高16位),试求这个数的负数。
(6)现有3个字节存储单元A、B、C,在不使用ADD和ADC指令的情况下实现:(A)+(B)=>(C)。
(7)用一条指令将CX中的整数变为奇数,如果原来已是奇数,则CX中数据保持不
变,如果原来是偶数,则(CX)+ 1形成奇数。
(8)用一条指令将CX中的整数变为偶数,如果原来已是偶数,则CX中数据保持不变,如果原来是奇数,则(CX)-1形成偶数。
3.10 给出下列指令的机器目标代码。
(1)MOV BL,12H[SI]
(2)MOV ES:12H[SI],BL
(3)ADD WORD PTR 0ABH[BP][DI],1234H
(4)SAL DX,1
(4)RCL BYTE PTR 10H[BX],CL
(5)NOT DI
(6)STC
(7)POP DS
(8)PUSH CX
习题四
4.1 设数据段数据定义如下:
DA TA SEGMENT
NUMBER1 DW 2008H
NUMBER2 DW 15 DUP(2006H)
STRING1 DB ‘How do you do? $’
BUF DB 10H DUP(1,2 DUP(2))
DA TA ENDS
下面几条MOV指令单独执行后,目的寄存器CX中的内容发是什么?
(1)MOV CX,NUMBER1
(2)MOV CX,NUMBER2
(3)MOV CX,TYPE NUMBER1
(4)MOV CX,TYPE STRING1
(5)MOV CX,LENGTH NUMBER2
(6)MOV CX,LENGTH STRING1
(7)MOV CX,SIZE NUMBER2
(8)MOV CX,SIZE BUF
4.2 按下面的要求写出相应的数据定义语句。
(1)定义一个字节区域,第一个字节的值为20,其后跟20个初值为0的连续字节;
(2)定义一个以0为结束符的字符串,其初值为:The course is easy;
(3)定义2008个字,其初值为任意值;
(4)定义一个双字变量,其初值为6571H。
4.3 已知下列程序段:
DA TA SEGMENT
DB1 DB 12H,34H,0,56H
DW1 DW 78H,90H,0AB46H,1234H
ADR1 DW DB1
ADR2 DW DW1
BUF DB 5 DUP(0)
DA TA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
……
XOR CX,CX
MOV CL,3
ADD ADR1,CX
SUB ADR2,CX
MOV BX,ADR1
MOV DI,BX
MOV SI,ADR2
MOV AL,DB1[BX]
MOV BUF[DI],AL
MOV AX,DW1[BX][SI]
MOV WORD PTR BUF,AX
……
CODE ENDS
上述程序运行结束后,BUF中各字节单元的内容是什么?
4.4 某数据段中有:
COUNT1 EQU 16H
COUNT2 DW 16H
下面两条指令有何异同?
MOV AX,COUNT1
MOV BX,COUNT2
4.5 已知有下列3个等值语句:
N1 EQU 30
M2 EQU 87
P3 EQU 4
那么下列表达式的值各是多少?
(1)M2/N1+M2 MOD P3 *2
(2)P3 SHL 4﹣2
(3)N1 GT M2 AND P3 LT M2(用8位二进制数表示)
(4)P3 OR 7
(5)N1 XOR P3
4.6 假设数据段中有数据定义如下:
PARTNO DW ?
FNAME DB 16 DUP(?)
COUNT DD ?
FLENGTH EQU COUNT﹣FNAME
PLENGTH EQU $﹣PARTNO
那么经过汇编后,FLENGTH和PLENGTH的值是多少?它们表示什么意义?
4.7 假设程序中有以下的数据定义及传送指令,那么传送指令执行后各寄存器的内容分别是什么?
DA TA SEGMENT
ORG $ +10H
BUF1 DW 1234H,5678H
BUF2 DW ‘AB’
BUF3 DW 20 DUP(0)
DA TA ENDS
……
CONST EQU 2345H
MOV AL,LOW CONST
MOV AH,HIGH CONST
MOV BL,HIGH (OFFSET BUF1)
MOV BH,LOW (OFFSET BUF2)
MOV CL,LOW (OFFSET BUF3)
4.8 已知有下列数据定义,根据这些数据定义完成规定的操作。
T1 DB ‘ABCDE’
T2 DW 1234H
T3 DB 20H DUP(?)
(1)用一条MOV指令将T1的偏移地址放入DI中;
(2)用一条MOV指令将T2的段基址放入DS中;
(3)用一条MOV指令将T2的低地址单元中的内容放入DL中;
(4)用一条EQU伪指令使符号CONST的值等于数组变量T3所占的总字节数。4.9 已知有下列数据定义语句:
DA1 DW ‘AB’,‘CD’,‘EF’
DA2 DW 1234H,5678H
试用DB定义语句将它们改写成在存储器中完全相同的存储形式。
4.10 已知有下列数据定义语句:
X1 DB 3,5
X2 DW 123,456
执行下列MOV指令后,各寄存器的值分别是多少?
(1)MOV AX,WORD PTR X1
(2)MOV BL,BYTE PTR X2
(3)MOV BH,X1+1
(4)MOV CX,X2+2
(5)MOV DL,BYTE PTR X2+1
(6)MOV DH,BYTE PTR X2+2
4.11 下面各题中语句有语法错误,试分别用两种方法修改使它们在汇编时能够通过:(1)M1 DW 5060H
……
MOV BL,M1
(2)M2 EQU 10H
……
MOV M2,AL
(3)M3 DW ‘ABCD’
(4)M4 DB 1234
(5)DATA1 SEGMENT
DA1 DW 1234H
DATA1 ENDS
DATA2 SEGMENT
DA2 DW 5678H
DATA2 ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA1
……
MOV BX,DA2
……
CODE ENDS
4.12 设已知数据段:
DA1 DB XX,XX
DA2 DB XX,XX
ADRR DW DA1,DA2
DA TA ENDS
为使ADRR+2字存储单元中存放内容为0022H,上面的方框中应填写什么语句?
4.13 下面的指令执行后,寄存器DS和SI的内容分别是多少?
ADDR DW 1234H,5678H,0ABCDH
……
LDS SI,ADDR+1
4.14 设某数据段为:
DA TA SEGMENT
ORG 20H
NUM1 = 8
NUM2 = NUM1+10H
DA1 DB ‘IBM PC’
DB 0AH,0DH
CONT EQU $﹣DA1
DA2 DW ‘IB’,‘M’,‘PC’,0A0DH
DA TA ENDS
上述数据段定义后,DA1和DA2的偏移量、CONT的值和DA2+5字节单元的内容分别是多少?
4.15 设某数据段为:
DA TA SEGMENT
DA1 DW 10H,$+20H,30H,$+40H
DA2 DW DA1+NUM+10H
DA TA ENDS
上述语句汇编后,$+20H和$+40H中的$分别是多少?为使DA2字单元中的值为50H,等号语句NUM后的空白处应填什么?
4.16 汇编语言源程序是如何装入CS、DS、SS和ES的?
4.17 汇编语言源程序在运行结束后为什么要返回操作系统?它们是如何返回的?
习题五
习题五
5.1 程序的基本结构有_______、_______与_______三种。
5.2 下面的程序段完执行后,AX,DX与BL的内容为多少?
MOV AX, 6540H
MOV DX, 3210H
MOV CL, 04
SHL DX, CL
MOV BL, AH
SHL AX, CL
SHR BL, CL
OR DL, BL
5.3 编写分支程序,在进行条件判断前,可用指令改变标志寄存器的某些位从而形成条件,下面的指令中不能形成条件的指令是_______。
(A) XOR (B) ADD
(C) TEST (D) MOV
5.4 在语法正确的情况下,指令JMP FAR PTR LABEL1属于_______。
(A) 段内直接寻址(B) 段内间接寻址
(C) 段间直接寻址(D) 段间间接寻址
5.5 指令JMP BX转移的目标地址的偏移量为_______。
(A) IP+BX的内容(B) BX的内容
(C) BX所指向的存储单元的内容(D) IP-BX的内容
5.6 下面的程序段条件转移语句发生跳转时,(AL)=________。
CMP AL, 0FBH
JNL NEXT
(A) 80H (B) 8FH
(C) 0F0H (D) 0FFH
5.7 设标识符DONE是程序中某指令语句的标号,与JMP指令同在一个逻辑段内,下列的哪个程序段不能够转移到标号DONE处的语句执行。
(A) JMP DONE
(B) MOV BX, OFFSET DONE
JMP BX
(C) MOV BX, DONE
JMP BX
(D) LEA BX, DONE
JMP DONE
5.8 下面的程序运行后,(AL)=_______,CF=_______。
MOV CL, 8
MOV AL, 0
NOT AL
ROL AL, CL
CMP AL, 0FFH
JZ NEXT
MOV AL, 0
NEXT: ……
5.9 在下面的程序段中,“DEC CX”指令执行了_______次。
MOV CX, 6
JCXZ NEXT
L1: DEC CX
JNZ L1
NEXT: ….
(A) 0 (B) 5
(C) 6 (D) 7
5.10 试分三种情况说明,当NUM字节单元中数据是什么情况时,TEMP字节单元分别是多少?
NUM DB ?
TEMP DB ?
……
MOV AL, NUM
TEST AL, 99H
JNE RES
AND AL, 99H
JMP END0
RES: JS NE
INC AL
JMP END0
NE: DEC AL
END0: MOV TEMP, AL
……
5.11 循环体包括哪几部分?
(A) 初始化部分、工作部分、控制部分、修改部分、结束处理部分
(B) 工作部分、修改部分、控制部分
(C) 工作部分
(D) 初始化部分、工作部分
5.12 循环控制指令LOOPNZ的转移条件是_______。
(A) (CX)≠0并且ZF=0 (B) (CX)≠0或者ZF=0
(C) (CX)=0并且ZF=0 (D) (CX)≠0并且ZF=1
5.13 下面的程序段执行后,BUF1的前5个字节单元内容分别是多少?
DATA SEGMENT
DA1 DW 123H, 456H, 0AB00H
DA2 DB 12H, 34H, 56H, 0ABH
DB $ - DA2
BUF1 DB 10H DUP(1,2,3)
BUF2 DB 10H, 20H, 30H
DATA ENDS
……
MOV SI, OFFSET DA1
MOV DI, OFFSET BUF1
MOV CX, 5
LOP: MOV AL, [SI]
MOV [DI], AL
INC SI
INC DI
LOOP LOP
……
5.14 已知BUF开始的数据区中存放有10个大、小写字母,下面程序段完成的功能是什么?
MOV CX, 10
LEA BX, BUF
L2: MOV AL, [BX]
CMP AL, ‘Z’
JBE L1
SUB AL, 20H
MOV [BX], AL
L1: INC BX
LOOP L2
5.15 下列程序执行后,寄存器AX,BX,CX与DX的内容分别是什么?如果将LOOP指令分别换成LOOPZ与LOOPNZ指令,结果又如何?
CODE SEGMENT
ASSUME CS:CODE
BEGIN:
MOV AX, 2
MOV BX, 3
MOV CX, 4
MOV DX, 5
NEXT: ADD AX, AX
MUL BX
SHR DX, 1
LOOP NEXT
MOV AH, 4CH
INT 21H
CODE ENDS
END BEGIN
5.16 阅读下列程序,回答下列问题:
(1) 该程序完成什么功能?
(2) 程序中的INC SI可否用指令ADD SI,1代替,为什么?
(3) 程序中的指令LEA SI, DATA1可用指令________代替。
(4)CLC的目的是________。
DA TA SEGMENT
DATA1 DB 85H, 27H, 4AH
DATA2 DB 93H, 87H, 65H
LEGH DW 3
SUM DB 0, 0, 0
DA TA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
BEGIN:
MOV AX, DATA
MOV DS, AX
LEA SI, DA TA1
LEA BX, DATA2
LEA DI, SUM
MOV CX, LEGH
CLC
AGAIN: MOV AL, [SI]
ADC AL, [BX]
MOV [DI], AL
INC SI
INC BX
INC DI
LOOP AGAIN
MOV AH, 4CH
INT 21H
CODE ENDS
END BEGIN
5.17 DX和AX联合存放一个32位整数(DX存放高16位),编写程序将该数据逻辑左移一位。
5.18 试编写程序将从键盘输入的小写字母用大写字母显示。
5.19 试编写程序将一个包含有20个有符号字节数据的数组ARRAY,分成正整数数组PLUS 与负整数数组NEGA两个数组,并且将这两个数组中的数据个数显示出来。
5.20 试编写程序将标志寄存器的高8 位与低8 位互换。
5.21 在大小为20个字节的数据区中产生排列为下列两种情况之一的数据,
第一种排列:DB ‘0’, ‘A’, ’1’, ’B’……’9’, ’J’
第二种排列:DB ‘A’, ‘0’, ’B’, ’1’……’J’, ’9’
并显示排列结果,产生哪种结果根据键盘输入1或2决定。
5.22 设有单字节有符号数X,Y与Z,如果X+Y>200,则求X-Z,否则求X+Z,运算结果存储在SUM字单元中。
5.23 已知一个多字节数据存放在以DA1开始的连续单元中,高字节存放在高地址单元,低字节存放在低地址单元,该数据的字节个数存放在LENG字节单元中,编写程序计算其绝对值,并存放回原位置。
习题六
6.1 定义子程序应该采用的一对伪指令是________。
(A) SEGMENT/ENDS (B) BEGIN/END BEGIN
(C) PROC/ENDP (D) CALL/RET
6.2 调用子程序的指令是________。
(A) RET (B) JMP
(C) LOOP (D) CALL
6.3 已知CALL BX执行前SP=100H,执行后SP的内容为________。
(A) 0FCH (B) 102H
(C) 98H (D) 0FEH
6.4 下列指令中,________属于段间间接调用。
(A) CALL SUB1 (B) CALL FAR PTR SUB1
(C) CALL DWORD PTR [BX] (D) CALL WORD PTR [BX][SI]
6.5 段内直接调用的转移范围为________。
(A) -128~127 (B) -32768~32767
(C) -65536~65535 (D) 0~32767
6.6 下面的子程序试图完成当AL与BL的内容相等时设置AL的内容为0,不相等时设置AL的内容为0FFH,有错吗?如果有错,请改正。
EXAM PROC
CMP AL, BL
JZ END0
MOV Al, 0FFH
RET
END0: MOV AL, 0
ENDP EXAM
6.7 CALL指令在段间调用与段内调用下各完成什么功能?
6.8 RET指令在段间返回与段内返回下各完成什么功能?
6.9 段间返回指令“RET 4”完成什么功能?
6.10 子程序在什么时候需要保护寄存器?有那两种方式?
6.11. 调用子程序时传递参数的方式一般有哪几种?
6.12. 请说明调用指令CALL与转移指令JMP的主要相同点与不同点。
6.13. 下面的子程序调用是否正确?
DA TA SEGMENT
V1 DB 5
V2 DB ?
DA TA ENDS
STACK1 SEGMENT PARA STACK
DW 10H DUP (?)
STACK1 ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA, SS:STACK1
BEGIN:
MOV AX, DA TA
MOV DS, AX
MOV AL, V1
CALL NEAR PTR DECM
MOV V2, AL
MOV AH, 4CH
INT 21H
DECM PROC FAR
DEC AL
DEC AL
RET
DECM ENDP
CODE ENDS
END BEGIN
6.14. 已知SHIFT是定义在代码段中属性为NEAR的子程序,数据段DATA中ADDR变量存放了SHIFT的偏移量,试根据上下文在代码中补齐指令实现3种调用SHIFT的方式。DA TA SEGMENT
……
ADDR DW OFFSET SHIFT
……
DA TA ENDS
STACK1 SEGMENT PARA STACK
DW 10H DUP(?)
STACK1 ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DA TA, SS:STACK1
BEGIN:
MOV AX, DA TA
MOV DS, AX
……
MOV BX, ADDR
CALL ________
……
MOV BX, OFFSET ADDR
CALL ________
……
CALL ________
……
MOV AH, 4CH
INT 21H
SHIFT PROC NEAR
……
SHIFT ENDP
CODE ENDS
END BEGIN
6.15 用示意图表示下列程序执行时,堆栈的变化情况。STACK1 SEGMENT PARA STACK
DW 128H DUP (?)
TOP LABEL WORD
STACK1 ENDS
CODE SEGMENT
ASSUME CS:CODE, SS:STACK1
BEGIN PROC FAR
PUSH DS
MOV AX, 0
PUSH AX
PUSHF
CALL SUB1
POPF
RET
BEGIN ENDP
SUB1 PROC NEAR
CALL FAR PTR SUB2
RET
SUB1 ENDP
CODE ENDS
CODE1 SEGMENT
SUB2 PROC FAR
PUSH CX
POP CX
RET
SUB2 ENDP
CODE1 ENDS
END BEGIN
6.16 编写程序,计算3!+4!+5!,并且将结果放入字变量RESULT中。
6.17 求数组中10个有符号字节数据中最大值与最小值的差,结果存入字变量RESULT中,要求查找最大值与最小值分别用子程序来完成,并且分别利用寄存器传递参数、堆栈传递参数来实现。
6.18 试编制程序,分别对NUM中各数统计出有多少个20,余下有多少个5,再余下有有多少个2,再余下有有多少个1。统计的各数分别存放在NUM20,NUM5,NUM2,NUM1的对应位置中,程序要求用主程序、子程序形式编制,而且用两种参数传递方法分别编制主程序和子程序。数据段如下:
DA TA SEGMENT
NUM DW 0133H, 0D5FH, 1234H
COUNT EQU ($ - NUM)/TYPE NUM
NUM20 DB COUNT DUP(0)
NUM5 DB COUNT DUP(0)
NUM2 DB COUNT DUP(0)
NUM1 DB COUNT DUP(0)
DA TA ENDS
习题七
1. 试编制子程序,完成AAA,DAA,AAS,DAS的指令功能
2. 试用两种不同方法,编制双精度(32位)求补程序
3. 编制一程序,找出从2开始指定数以内的质数,并统计个数。