汇编程序语言设计复习题整理
2011-11-27 14:57
148 查看
汇编复习题整理 1、80X86微型计算机的组织 1-10 写出下列十进制数的十六进制表示。 18 34 87 255 4095 62472 解:18=12H;34=22H;87=57H; 255=0FFH;4095=0FFFH; 62472=0F408H; 1-12 处理器的主要功能是实现所有指令的执行并处理数据。 1-14 指出处理器是如何存储的内存中的一个值 (a) hex 1234; (b) hex 01c3b5 解:(a)高位地址 12H 低位地址 34H 地址 内存 (b)高位地址 01H 0c3H 低位地址 0b5H 地址 内存 1-15: 说出段,偏移量,地址边界的定义: 解: 段:一个程序段边界上开始的部分,大小为64K,包含代码,数据,堆栈。 偏移量:是段边界上开始到段中其他位置的字节距离。 段边界:可以被16整除的位置; 1-18: 指出下列操作所需的寄存器: (a) 段寻址; (b) 要执行的指令的偏移地址; (c) 加法和减法操作; (d) 乘法操作; (d)乘法和除法操作; (e)循环计数; (f)标示结果为零。 解:(a) CS,DS,SS; (b) IP; (c) AX,BX,CX,DX,DI,SI; (d) DX, AX; (e) CX; f) ZF 二、单选 1. 十六进制数88H可以被其他形式的数所表示, 下列哪种表示方法是错的?D A. 无符号十进制136 C.压缩的BCD码 88 B. 带符号十进制–120 D. 带符号数据 –8 解:错误的是D选项,A选项 88=8*16^1+8=136,正确,B选项 带符号的十六进制 转换十进制方法:先将十六进制用二进制形式表示88H=10001000B,然后按位取反,末位加1 得01111000,再转换为十进制得-120,正确;C选项 正确。 2. 如果DH=10H, 执行NEG DH 指令, 正确的结果是(D. ). A. DH=10H C=1 C. DH=10H C=0 B. DH=0F0H C=0 D. DH=0F0H C=1 3.哪个是指令指针寄存器? A A.IP B.SP C.BP D.PSW(program status word) 4. 如果 AX=1000H, NEG AX NEG AX 上面两条指令执行后, AX= (C ). a.1001H b.1002H c.1000H d.0F000H 解:指令NEG是取反的意思,两次取反自然为本身。故选C 2.2 有两个16位的字1EE5H 和 2A3CH 存储在IBM PC 的000B0H 和000B03H 的内存单元中,请以图表的形式说明内存中的存储情况。 解: 内存地址 内容 000B4H 2AH 000B3H 3CH 000B2H 000B1H 1EH 000B0H E5H 2.3 如下图, 展示的是IBM PC的内存信息, 请说明30022H 字节单元和30024H字节单元的内容,和30021H 字单元和30022H 字单元的内容。 解: 存储器 30020H 12H 30022H字节单元的内容=0ABH 30021H 34H 30024H字节单元的内容=0EFH 30022H ABH 30021H字单元的内容=0AB34H 30023H CDH 30022H字单元的内容=0CDABH 30024H EFH 2.4 3017:000A的段地址的物理地址和偏移量是什么? 3015:002A和3010:007A的段地址和偏移是什么? 解:段地址的物理地址是:3017AH;偏移量是:000AH 物理地址1:PA= 3017 × 10H + 000AH = 3017AH 物理地址2: PA= 3015 × 10H + 002AH = 3017AH 物理地址3: PA= 3010 × 10H + 007AH = 3017AH 2.5 运行程序之前, (CS)=0A7F0H,(IP)=2B40H, 程序的第一个字的物理地址是什么? 解: PA=(CS)×10H+(IP)= 0A7F00H + 2B40H = 0AAA40H 2.8 哪类型的寄存器可以用来显示内存地址? 解:CS, DS, ES, SS, IP, SP, BP, BX, DI, SI, EAX, EBX, ECX, EDX, EBP, EIP, ESP, EDI, 5. 假定DS = 5788H, 偏移量是94H, 字节的PA(物理地址) (A). a.57974H b.57914H c. 5883H d. 58ECH 解: PA=5788H*10H+94H=57974H 6.在段中寻址的时候,在8086CPU的寄存器中,哪些寄存器可以提供偏移地址(B) A. AX, BX, CX, DX C. SP, IP, BP, DX B. BX, BP, SI, DI D. CS, DS, ES, SS 概念总结: CPU―-分析,控制并执行指令的部件,由算术逻辑部件ALU和寄存器组等组成。 存储器――存储程序,数据等信息的记忆装置,PC机有RAM和ROM两种。 堆栈――以后进先出方式工作的存储空间。 IP――指示 下一条要执行指令的地址。 SP――保存 当前栈顶地址的寄存器。 状态标志――记录指令操作结果的标志,共6位;OF,SF,ZF,AF,PF,CF. 控制标志――控制操作的标志,P机有三位,DF,IF,TF. 段寄存器――保存各逻辑段的起始地址的寄存器,PC机有4个:CS,DS,SS,ES. 物理地址――唯一代表存储空间中每个字节单元的地址。 汇编语言――用指令的助记符,符号地址,标号等符号书写程序的语言。 机器语言――能被计算机直接识别执行和的语言。 汇编程序――把汇编语言程序翻译成机器语言程序的系统程序。 连接程序――把若干个模块连接起来成为可执行文件的系统程序。 指令――告诉CPU要执行的操作(一般还要指出操作数的地址),在程序运行时执行。 伪指令――由汇编程序在汇编过程中执行的指令。 3. 调试 3-7 用DEBUG的E命令来进入下列的机器语言程序: 机器码(在00H中):A0 00 D0 E0 F6 26 01 02 A3 02 02 90 数据(在200H中):2A 12 00 00 程序的实现的功能如下: 把DS:0200(2A)中的一个字节的内容移到AL寄存器。 把Al 中的一个位移动到左边(结果是54。) 把在DS:0201中的一字节内容与AL相乘。 把结果从AX中移到 DS:0202的开始的字; 键入程序后, 键入D 命令来查看代码和数据。 键入R 和连续的T 命令来一步步运行程序直到到达NOP。 这时, AX 应该包含了结果05E8H。 键入另一个D DS:0200,且注意到在DS:0202 中的结果是E805。 调试: -E CS:100 A0 00 02 D0 E0 F6 26 01 02 A3 02 02 90 ;输入E指令 -D CS:100 LC 1370:0100 A0 00 D0 E0 F6 26 01 02-A3 02 02 90 .....&...... -E DS:200 2A 12 00 00 -D DS:200 L4 1370:0200 2A 12 00 00 -R AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0B41 ES=0B41 SS=0B41 CS=0B41 IP=0100 NV UP EI PL NZ NA PO NC 0B41:0100 A00002 MOV AL,[0200] DS:0200=2A -T AX=002A BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0B41 ES=0B41 SS=0B41 CS=0B41 IP=0103 NV UP EI PL NZ NA PO NC 0B41:0103 D0E0 SHL AL,1 -T AX=0054 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0B41 ES=0B41 SS=0B41 CS=0B41 IP=0105 NV UP EI PL NZ NA PO NC 0B41:0105 F6260102 MUL BYTE PTR [0201] DS:0201=12 -0B41:0105 F6260102 MUL BYTE PTR [0201] DS:0201=12 -T AX=05E8 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0B41 ES=0B41 SS=0B41 CS=0B41 IP=0109 OV UP EI PL NZ NA PO CY 0B41:0109 A30202 MOV [0202],AX DS:0202=0000 -T AX=05E8 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0B41 ES=0B41 SS=0B41 CS=0B41 IP=010C OV UP EI PL NZ NA PO CY 0B41:010C 90 NOP -D DS:202 L2 0B41:0200 E8 05 3-8 问题3-7, 键入命令进入写在硬盘上的程序HEXMULT.COM. 调试: -U 100 10C 0B41:0100 A00002 MOV AL,[0200] 0B41:0103 D0E0 SHL AL,1 0B41:0105 F6260102 MUL BYTE PTR [0201] 0B41:0109 A30202 MOV [0202],AX 0B41:010C 90 NOP -N HEXMULT.COM -R BX BX 0000 :0 -R CX CX 0000 :000B -W Writing 0000A bytes 3-9. 用 DEBUG的A命令来进入下列指令: MOV CX,3B ADD CX,1C SHL CX,01 SUB CX,36 NOP 反汇编这些指令跟踪指令的运行直到NOP. 并且对每条指令,都查看CX寄存器的值。 调试: -A 0B41:0100 MOV CX,3B 0B41:0103 ADD CX,1C 0B41:0106 SHL CX,1 0B41:0108 SUB CX,36 0B41:010B NOP -U 100 10B 0B41:0100 B93B00 MOV CX,003B 0B41:0103 83C11C ADD CX,+1C 0B41:0106 D1E1 SHL CX,1 0B41:0108 83E936 SUB CX,+36 0B41:010B 90 NOP -T AX=0000 BX=0000 CX=003B DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0B41 ES=0B41 SS=0B41 CS=0B41 IP=0103 NV UP EI PL NZ NA PO NC 0B41:0103 83C11C ADD CX,+1C -T AX=0000 BX=0000 CX=0057 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0B41 ES=0B41 SS=0B41 CS=0B41 IP=0106 NV UP EI PL NZ AC PO NC 0B41:0106 D1E1 SHL CX,1 -T AX=0000 BX=0000 CX=00AE DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0B41 ES=0B41 SS=0B41 CS=0B41 IP=0108 NV UP EI PL NZ AC PO NC 0B41:0108 83E936 SUB CX,+36 -T AX=0000 BX=0000 CX=0078 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0B41 ES=0B41 SS=0B41 CS=0B41 IP=010B NV UP EI PL NZ NA PE NC 0B41:010B 90 NOP 4. 语句 4-3. 两种类型的标示符是什么? 答案:是标号和名称。 4-4.下列哪些命名是正确的: (a) CX; (b)25C4; (c) @$_X; (d)$25; (e)AT&T. 如果不正确,解释原因 答案: 正确的命名是: (c) @$_X (d)$25 不正确: (b)25C4 以数字开头 (e)AT&T &是非法字符 (a)CX 只再与CX 寄存器关联时是对的 4-9. (a) 解释过程的作用 (b) 怎么样定义一个过程的起始和结尾? (c) 什么时候应该定义FAR过程? (d)什么时候应该定义NEAR过程? 答案: (a) 过程提供了相关的代码部分。 (b) 过程名 PROC 过程名 ENDP (c) 在另一段中调用代码 (d)在同一段中调用代码 4-10. 哪些END语句与结束 (a)一个过程; (b)一个段; (c) 一个程序 相关? 答案: (a)ENDP (b) ENDS (c) END 4-11.区分结束汇编过程和结束程序执行的语句. 答案: END表示汇编结束 MOV AX,4C00H 和 INT 21H 结束CPU的运行。 4-12. 把名称STKSEG, DATSEG, 和CDSEG分别分配给堆栈,数据段, 和代码段, 编写所需的ASSUME 语句. 答案: ASSUME SS:STKSEG, DS:DATSEG, CS:CDSEG 4-17.通过AREA5定义下列数据项中的名称为ARE1的数值。 分别是: (a)一个1字节项包含的二进制数相当于十进制数35。 (b)一个双字包好着连续的数12,14,22,28,33和 41。 (c)一个 2字节的项 包含着未定义的值。 (d)一个 1字节的项 包含的十六进制相当于十进制数58。 (e)一个4字节的项包含的十六进制相当于十进制数436。 答案: (a) AREA1 DB 0010 0011B (b) AREA2 DW 12,14,22,28,33,41 (c) AREA3 DW ? (d) AREA4 DB 3AH (e) AREA5 DD 1B4H 单选: 1.汇编程序的语句中,可以省略 (B ) A. 名称 B. 操作符 C. 操作数 d.注释 2.正确结束伪指令的句子是( C): A.汇编程序把伪指令翻译成机器代码。 B.伪指令在程序执行期间完成它的功能。 C.伪指令的功能是告诉汇编程序在汇编过程实现特殊的处理 3. 对于END 伪指令, 哪句话是对的? C. a. END 伪指令是一个可执行指令。 b. END 伪指令指明执行程序的终止之处。 c. END 伪指令指明整个源程序的终止。 d. END 伪指令会在汇编过程生成机器码。 4. 执行下列指令后, 变量DAB 的内容是C DAW DW 2A05H DAB DB 0FAH … MOV AL, BYTE PTR DAW SUB DAB, AL a. 0DAH b. 0FAH c. 0F5H d. 0D0H 7. BUF DW 10H DUP (3 DUP (2, 10H), 3, 5) 汇编了语句后, 变量BUF所分配的地址是 ( b). a. 80H b. 100H c. 124H d. 192H 1. ARY DW 10 DUP(?) … MOV AL, TYPE ARY MOV BL, LENGTH ARY MOV AL, SIZE ARY 一系列MOV指令运行后,结果是 ? 答案: (AL)=2, (BL)=10D, (al)= 20D 填空: 1. 可汇编语句中,有两种类型的语句(指令语句) 和 (伪指令语句) 2. ARY DW 10DUP(?) …… MOV AL, TYPE ARY ;执行后(AL)= 2 MOV CL, SIZE ARY ; 执行后(CL)= 20 分析程序 DA_BY DB 83H, 73H, 61H, 94H, 5AH MOV CX, WORD PTR DA_BY AND CX, 0FH MOV AL, DA_BY+3 SHL AL, CL 上述指令执行后, AL= A0H ,CL= 03H 7.1 指令和伪指令的不同点?伪指令的功能是什么? 答案: 指令和伪指令的不同是是否生成可执行的机器码。 伪指令只是用来告诉汇编程序采取特殊的处理,不生成机器码。 7.3 数值表达式跟地址表达式的不同点? 答案: 数值表达式是一个值可以在汇编过程中被汇编程序计算的表达式。 地址表达式表征着操作数内存项的地址。 7.4 在汇编程序中,变量和标号的不同点? 答案: 标号表示机器指令码所在的内存位置; 变量表示着数值所在的内存位置; 7.5 计算下面表达式的值 ①23H AND 45H OR 67 ②1234H/16+10H ⑤LOW 1234H OR HIGH 5678H ⑥23H SHL 4 答案: ① 43H ② 133H ⑤ 76H ⑥ 230H 7.7 如果有如下的一个程序段. 写出运行后AX寄存器的内容 ORG 100H 100 VARW DW 1234H,5678H 104 VARB DB 3,4 106 VARD DD 12345678H 10A BUFF DB 10 DUP(?) 114 MESS DB ‘HELLO’ 119 BEGIN: MOV AX,OFFSET VARB+OFFSET MESS ;218H MOV AX,TYPE BUFF+TYPE MESS+TYPE VARD ;6H MOV AX,SIZE VARW+SIZE BUFF+SIZE MESS ;0DH MOV AX,LENGTH VARW+LENGTH VARD ;2H MOV AX,LENGTH BUFF+SIZE VARW ;CH MOV AX, TYPE BEGIN ;-1 MOV AX, OFFSET BEGIN ;119H 选择: 3. 对于END 伪指令, 那一句是对的? a. END 伪指令是一个可执行指令。 b. END 伪指令指明执行程序的终止之处。 c. END 伪指令指明整个源程序的终止。 d. END 伪指令会在汇编过程生成机器码 答案:C 3. DATA SEGMENT ORG 20H NUM1 = 8 NUM2 = NUM1 + 10H DA1 DB ‘COMPUTER’ DB 0AH, 0DH COUNT EQU $-DA1 DA2 DW ‘CO’, ‘MP’, ‘UT’, ‘ER’ DATA ENDS 答案: (1) DA1的偏移量是20H (2) COUNT的值是10D (3) DA2的内容+2 字节的位置是 P 4. DA3 EQU WORD PTR DA4 DA4 DB 0ABH, 89H … SHR DA3, 1 MOV DX, DA3 SHL DA4, 1 MOV CX, DA3 程序执行之后: CX= 44AAH, DX=44D5H 7.12如下程序段中有几个语句. 解释每一个符号的属性。 SYMB1 LABEL BYTE SYM2 EQU THIS BYTE SYMB3 DW ? SYMB4 EQU BYTE PTR SYMB3 答案: SYMB1 BYTE SYM2 BYTE SYMB3 WORD SYMB4 BYTE 4.7 请定义一个数据段DATASG, 在段中定义字符变量和数据变量,要求如下: (1) FLD1B 是一个字符变量: ’personal computer’; (2) FLD2B十进制数的字节变量 32; (3) FLD6B 10 个0的字节变量; (4) FLD7B 是一个硬件名称的列表 (ASCII code) 和数量(十进制数) (10)FLD3W 是(7)中硬件列表地址变量。 (11)FLD4W 是一个字变量包含5 个十进制数:5,6,7,8,9; (13)FLD6W 是段中字节数据变量地址和字数据变量地址之差。 答案: DATASG SEGMENT FLD1B DB ‘personal computer’ FLD2B DB 32 FLD6B DB 10 DUP(0) FLD7B DB ‘PART1’,20,’PART2’,50,’PART3’,14 FLD3W DW FLD7B FLD4W DW 5,6,7,8,9 FLD6W DW FLD3W-FLD1B 4.8 有一个数据段如下定义,PLENTH的值是多少? 意味着什么? PARTNO DW ? PNAME DB 16 DUP(?) COUNT DD ? PLENTH EQU $-PARTNO 答案: 值是22.相对PARTNO的偏移量 4.9 如下有几个语句,问: L的值? BUFF DB 1,2,3,’123’ EBUFF DB 0 L EQU EBUFF-BUFF 答案:L的值是6 4.10 有如下数据段。 (1) 用MOV 指令把LNAME的有效地址移到AX。 (2) 用一条指令来移动CODE_LIST前两个字节的内容到SI。 (3) 编写伪指令让CODE_LIST的与段得长度相等. LNAME DB 30 DUP (?) ADDRESS DB 30 DUP(?) CITY DB 15 DUP(?) CODE_LIST DB 1,7,8,3,2 答案: (1) MOV AX, OFFSET LNAME (2) MOV SI , WORD PTR CODE_LIST (3) CODE_LENTH EQU $-CODE_LIST 4.11 尝试写出整个数据段DATA_SEG, 它把5赋给一个字节, 且把整数–1,0,2,5 和4 放入10个字的数组DATA_LIST的前5个单元 。然后写出整个代码段, 功能是把DATA_LIST的前5 个数中的最大值和最小值放到 MAX 和 MIN。 答案: DATA_SEG SEGMENT DATA1 DB 5 DATA_LIST DW -1,0,2,5,4, 5 DUP(?) MAX DB ? MIN DB ? DATA_SEG ENDS CODE_SEG SEGMENT ASSUME DS:DATA_SEG,CS:CODE_SEG BEGIN: MOV MAX, 5 MOV MIN, -1 CODE_SEG ENDS END BEGIN 6-1.寻址 3.1 给出(BX)=637DH,(SI)=2A9BH,偏移量D=7237H,尝试指出下列每一种寻址模式的有效地址。 (1) 立即寻址; (2) 直接寻址 (3) 用BX的寄存器寻址; (4) 用BX的寄存器间接寻址; (5) 用BX的寄存器相对寻址; (6) 基址变址寻 (7)相对基址变址寻 答案:(1)无 (2)EA=7237H (3)无 (4)EA=637DH (5)EA=D+[BX]=7237H+637DH=0D5B4H (6)EA=[BX]+[SI]=637DH+2A9BH=8E18H (7)EA=D+[BX]+[SI]=7237H+637DH+2A9BH=1004FH 3.2 根据下列要求, 写出相关的汇编语言指令。 (1) 把BX 的内容和DX 的内容相加,结果放入DX 中。 (2) 把AL的内容加上内存地址的内容,并把结果放到AL中。内存地址由BX和SI进行基址变址寻址所得。 (3)把CX的内容加上内存地址的一个字,并把结果放到内存地址中。内存地址由BX和偏移量0B2H进行寄存器相对寻址所得。 (4) 把内存地址的内容与数2A59H相加,并把结果放入内存地址。内存地址由偏移量0524H进行直接寻址所得。 (5) 把数值0B5H 与AL 寄存器的内容相加, 结果放入AL寄存器。 答案: (1)ADD DX, BX (2)ADD AL, BX[SI] (3)ADD WORD PTR 0B2H [BX], CX (4)ADD WORD PTR [0524H], 2A59H (5)ADD AL, 0B5H 3.3 写出指令,把首址是BLOCK的字数组中的第六个字移入DX寄存器。使用如下的寻址方式。 (1) 寄存器间接寻址 (2) 寄存器相对寻址 (3) 基址变址寻址 答案: (1) LEA BX, BLOCK+10 MOV DX, WORD PTR [BX] (2) LEA SI, BLOCK MOV DX, WORD PTR 0AH[SI] (3)LEA BX, BLOCK MOV SI, 0AH MOV DX, WORD PTR [BX][SI] 3.4给出(DS)=2000H,(BX)=0100H,(SI)=0002H,(20100)=12H, (20101)=34H, (20102)=56H, (20103)=78H, (21200)=2AH,(21201)=4CH,(21202)=B7H, (21203)=65H, 尝试解释:执行指令后,AX寄存器的内容。 (1) MOV AX, 1200H (3) MOV AX, [1200H] (5) MOV AX, 1100[BX] (7) MOV AX, 1100[BX][SI] 答案: (1) (AX)=1200H (3)(AX)=4C2AH (5)(AX)=4C2AH (7)(AX)=65B7H 3.8 给出(DS)=2000H,(ES)=2100H,(SS)=00A0H,(BX)=0100H,(BP)=0010H,数据段中VAL 的偏移地址是0050H,指出源操作数段得寻址方式和物理地址。 (2) MOV AX, BX (4) MOV AX, VAL (6) MOV AX, ES:[BX] (8) MOV AX, [SI] (10)MOV AX, VAL[BX] (12)MOV AX, VAL[BX][SI] 答案: (2)寄存器寻址 (4)直接寻址,物理地址=20050H (6)寄存器间接寻址,物理地址=21100H (8)寄存器间接寻址,物理地址=200A0H (10)寄存器相对寻址,物理地址=20150H (12)相对基址变址寻址,物理地址=201F0H 6-2 单选: 1.当执行POP [BX] 和寻找目标操作数时,段地址跟偏移地址是在( B )中。 a. 无段地址也无偏移地址 b. DS 和BX中 c. ES 和 BX中 d. SS 和 SP中 2.下列指令中, 哪个是错的? a. MOV SS:[BX+DI],1000H b. MOV DX, 1000H c. MOV WORD PTR [BX],1000H d. MOV DS, 2000H 答案: d. 错误: 立即数到段寄存器 编写指令: 1. D1 DB 20H DUP(?) D2 DW D1 给出三种方式,使用一条指令来把D1的偏移量载入到SI中。 答案: 1. LEA SI, D1 2. MOV SI, OFFSET D1 3. MOV SI, D2 简答: 1. 指出下列的错误: 1)MOV AH, BX 2)MOV [BX], [SI] 3)MOV AX,[SI] [DI] 4)MOV MYDAT [BX][SI], ES:AX 5)MOV BYTE PTR[BX], 1000 6)MOV BX, OFFSET MYDAT[SI] 7)MOV CS, AX 解: 1)MOV AH, BX ;操作数大小不同 2)MOV [BX], [SI] ;出错:内存到内存 3)MOV AX,[SI] [DI] ;出错: 把[SI][DI]放到一起 4)MOV MYDAT [BX][SI], ES:AX ; 与2同, 5)MOV BYTE PTR[BX], 1000 ; 与1同, 6)MOV BX, OFFSET MYDAT[SI] ;删除[SI] 7)MOV CS, AX ;出错: CS 是第一操作数 填空: .MODE SMALL .DATA DFATA1 DW 2000H DATA2 DW 3000H .CODE .STARTUP LEA SI,DATA1 MOV DI, OFFSET DATA2 MOV BX, [SI] MOV CX, [DI] MOV [SI], CX MOV [DI], BX .EXIT END 程序执行之后, (DATA1) = 3000H (DATA2) = 2000H 3.10 TABLE 是一个在数据段中0032上的符号, 它的内容是1234H, 下面指令有什么不同?执行指令后AX寄存器的内容是什么? MOV AX, TABLE LEA AX,TABLE 答案: (AX)=1234H (AX)=0032H 3.11 执行下列指令后AX 寄存器的内容是什么? TABLE DW 10,20,30,40,50 ENTRY DW 3 … …… MOV BX,OFFSET TABLE ADD BX ENTRY MOV AX [BX] (BX)=0000H (BX)=0003H 答案: (AX)=1E00H 7.8 下列指令中,符号ABCD 是一个变量。说出两条指令的不同。 MOV AX,OFFSET ABCD LEA AX,ABCD 答:两条指令都是取ABCD的偏移地址 但MOV指令能以更少的时间完成同样的功能。 7.10 如下的一个程序段。请改正错误的指令。 VARW DW 1234, 5678H VARB DB 3,4 VARD DD 12345678 …… MOV AX,VARB MOV VARD,BX MOV VARD+2,ES MOV CL,VARW+3 LES DI,VAFW 改正如下: MOV AX , WORD PTR VARB MOV WORD PTR VARD , BX MOV WORD PTR VARD+2 , ES MOV CL , BYTE PTR WARW +3 8-1 、编程逻辑和控制要求 8-2 (a) 一个近 JMP, LOOP, 和条件跳转指令可以跳转的字节的最大值是什么? (b) 机器代码的操作数的什么特点导致了这种限制?? 答案: (a)JMP:两操作数字节. LOOP:一个操作数字节 条件跳转:一个操作数字节 8-3一条JMP指令从偏移位置05C8H开始。指出JMP 的操作数跳转的偏移地址, 基于下列目标代码: (a) 14H;(b) 7DH;(c) A3H 答案: (a)05C8H+0014H+2H=05DEH. (b)05C8H+007DH+2H=0647H. (c)05C8H+FFA3H+2H=056DH. 8-5 假定AX 和BX 包含了无符号数据且 CX 和 DX包含了带符号数据。指出下列所需的CMP (必要时)和条件跳转指令 : (a) AX 等于或小于BX ? (b) CX等于或小于DX? (c) CX 的值大于 DX? (d) AX 的值大于BX? (e) DX 包含零吗? (f)有溢出吗? 答案: (a)CMP AX, BX JBE Address (b)CMP CX, DX JLE Address (c)CMP CX, DX JG Address (d)CMP AX, BX JA Address (e)CMP DX, 0 JE Address (f)JO Address 8-10 在一个.EXE 程序中, F10 调用G10, G10 调用H10, H10 调用J10.因为这些调用,堆栈中现在包含多少个地址? 答案:3 个地址 8-13 假定BX 包含二进制10111001 10111001 和CL 包含3. 指出下列指令运行后BX的十六进制值 : a) SHL BL 1; b) SHL BX,CL; c) SHR BX,CL; d) SHR BX,1; e) SAL BH,1; f) ROR BX,CL; g) ROR BL,CL 答案: a)B972H(BL逻辑左移一位) b)0CDC8H(BX逻辑左移3位) c)1737H(BX逻辑右移3位) d)5CDCH(BX逻辑右移1位) e)72B9H(BX算术左移1位) f)3737H(BX循环右移3位) g)B937H(BL循环右移3位) 8-14 用移位, 移动, 和加法指令来以40H初始化CX 并且乘于10. 答案: MOV CX, 40H MOV AX, CX MOV BX, CX MOV CL, 3 SHL AX, CL SHL BX, 1 ADD AX, BX 8-15 命名为“旋转位”的章节末尾有一个例子,把DX:AX乘于2。修改这个程序a) 乘于4 b) 除于4 c) 把DX:AX:BX中的48位乘于2。 答案: a) SHL AX, 1 RCL DX, 1 SHL AX, 1 RCL DX, 1 b) SAR DX, 1 RCR AX, 1 SAR DX, 1 RCR AX, 1 c) SHL BX, 1 RCL AX, 1 RCL DX, 1 2.假定VAR1 和 VAR2 是字变量, LAB 是标号, 指出下列的错误: ADD VAR1,VAR2 SUB AL, VAR1 JMP LAB[SI] JNZ VAR1 JMP NEAR LAB 错误: 1.ADD 内存, 内存 2. 两个操作数大小不同 3.删除[SI] 或者 删除 LAB 4. 条件跳转范围<= 字节, 不是字 5. 应该是JMP NEAR PTR LAB 3、A DW 1234H B DW 5678H …… PUSH A PUSH B POP A POP B 回答: ① 执行之后(A)=5678H ,( B)= 1234H ② 执行程序之前SP=200H, 执行之后SP= 200H 8-2 分析指令: 1、MOV AX,6540H MOV DX,3210H MOV CL,04 SHL DX,CL MOV BL,AH SHL AX,CL SHR BL,CL OR DL,BL 执行指令之后, (AX)=5400H,(BL)=06H, (DX)=2106H 2、MOV AL,200 SAR AL,1 MOV BL,AL MOV CL,2 SAR AL,CL ADD AL,BL 执行指令之后 (BL)=0E4H (AL)=0DDH 3 .BLK1 DB 46,84,34,-5,20,122,73 MOV CX,7 LEA S1,BLK1 NEXT: MOV AL,[SI] INC SI TEST AL,81H LOOPZ NEXT MOV BL,[SI] 执行指令之后: (AL)=0FBH(BL)=20 / 14H 6、 AND AL,AL JZ BRCH1 RCR AL,1 JZ BRCH2 RCL AL,1 INC AL JZ BRCH3 执行指令之后, 回答: (1)当(AL)=0时,程序跳到BRCH1 (2)当(AL)=1时,程序跳到BRCH2 (3)当(AL)=0FFH时,程序跳到BRCH3 12.串 单选: 1.当在串指令之前使用REPE 立即前缀时,当 (C),串指令将会停止。 A. CX=0 and ZF=0 B. CX=0 and ZF=1 C. CX=0 or ZF=0 D. CX=0 or ZF=1 2.下列哪条指令有合理和充分的意义? D A. REP LODSB B. REP SCASB C. REP CMPSB D. REP MOVSB 13.算术 13.1 对于无符号和带符号的数据。(a)字节的最大值是什么(b)字的最大值是什么? 答案: (a):对于带符号数据:+127and128; 对于无符号数据:0 and 255 (b):对于带符号数据:-32768 and 32767 对于无符号数据:0 and 65535: 13-2 区分算术操作的进位和溢出。 答案: C 位代表无符号数据的溢出; C=1,有进位/借位; 其他情况C=0。 O 代表带符号数据的溢出。 加法: 当两个操作数的符号相同,但是结果的符号与操作数不同时,O 位被置位 (O=1)。其他情况O = 0。 减法: 如果两个操作数符号不同, 结果和减数的符号相同,那么O =1;其他情况 O = 0。 13-3 对于下列的二进制加法, 指出二进制的和作为带符号和无符号的十进制的和, 指出溢出标志和进位标志的值: a) 0011 0011 + 0001 1000 b) 0111 0110 + 0001 1001 c) 1101 0110 + 0101 1001 答案: a b C Sum 0100 1011 1000 1111 0010 1111 CF 0 0 1 OF 0 1 0 13.5编写代码: a): 字VALUE1 和字VALUE2相加; MOV AX, VALUE2 ADD AX, VALUE1 (b): 以VALUE1开始的双字 和双字VALUE2相加; MOV EAX, VALUE1 ADD EAX, VALUE2 13.7 编写代码(MUL) (a) 字VALUE1 和VALUE2相乘; MOV AX, VALUE1 MUL VALUE2 (b) 以VALLE1开始的双字 与字VALUE2相乘; MOV AX, VALUE1 MUL VALUE2 MOV RESULT, AX MOV RESULT+2, DX MOV AX, VALUE1+2 MUL VALUE2 ADD RESULT+2, AX ADC RESULT+4, DX ADC RESULT+6, 0 13.8编写代码(DIV) : (a): 字VALUE1 除于36; MOV AX, VALUE1 MOV BL, 36 DIV BL (b): 以双字开始的VALUE1 除于字VALUE2; MOV AX, VALUE1 MOV DX, VALUE1+2 DIV VALUE2 13.9 除了除以零之后,除以什么数会导致溢出错误? 答案: 除数必须比被除数小。例如除于1,如除以1生成一个商数,是与被除数相同,也可能导致中断和溢出错误。 3.40 分析下列代码段: ADD AX, BX JNO L1 JNC L2 SUB AX, BX JNC L3 JNO L4 JMP SHORT L5 AX的内容和CX的内容如下 : AX BX B568 54B7 程序执行后,会跳转到哪里? 答案: L1 L3 3.47 指令填空: (1) LOOP L20 (2)LOOPE L20 (3)LOOPNE L20 尝试指出在3个不同情况下,程序执行之后AX,BX,CX,DX 寄存器的内容 ? TITLE EXLOOP.COM CODESG SEGMENT ASSUME CS: CODESG, DS: CODESG,SS:CODESG OGR 100H BEGIN: MOV AX, 01 MOV BX, 02 MOV DX, 03 MOV CX, 04 L20: INC AX ADD BX, AX SHR DX, 1 ( ) RET CODESG ENDS END BEGIN 答案: (1) LOOP L20 :AX=05H ; BX=10H ; CX=00H ; DX= 00H (2) LOOPNE L20: AX=03H; BX=7H; CX=2H ; DX=00H (3)LOOPE L20:没有进行循环 AX=02H; BX=4H; CX=3H; DX=1H 4-1 写出ADD指令,完成如下操作: (a) 把BX 加到AX ADD AX, BX (b) 把 12H加到AL ADD AL, 12H (c ) 把 EDI 加到 EDP ADD EDP, EDI (d) 把22H 加到 CX ADD CX. 22H (e) 把SI的地址数据加到AL ADD AL, [SI] (f)把CX 加到FROG地址的数据上 ADD FROG, CX 4.2 指出指令ADD ECX,AX的错误? 答案: ECX 和AX的大小不一致。 4.3 可以用ADD 指令把CX 加到DS吗? 答案: 不可以,因为DS是段寄存器。 4.4 给出AX=1001H,DX=20FFH,执行ADD AX,DX后,列出标志寄存器的总和和每一位的内容。 答案: AX=3100H; C=0;最高位没有进位 A=1;第三和第四位没有进位 S=0;结果为正 Z=0;结果非零 O=0;结果没有溢出 4.6 设计一个简短的程序,把AX,SX,CX,DX 和SP 累加在一起,把结果存进DI中。 LEIJIA PROC NEAR ADD AX, BX ADD AX, CX ADD AX, DX ADD AX, SP MOV DI, AX RET LEIJIA ENDP 4.9 写出把sp的内容加1的指令。 指令:INC SP 4.10 写出SUB 指令,完成如下操作。 (a) 从AX中减去BX 指令:SUB AX, BX (b) 从 DH中减去 0EEH 指令:SUB DH, 0EEH 4.11 解释SBB [DI-4],DX的结果 答案: 从由DI-4寻址的内存单元中,减去CX,同时也减去借位。 4.12 解释SUB 和CMP指令的不同 答案: 指令SUB的功能是 从源操作数减去目标操作数,然后把结果存储到目标操作数, 而CMP指令并不会改变两个操作数的内容,只会改变标志位 。 4.13 当8-位 操作数加上另外一个数,结果存在哪里? 答案: 在AX 寄存器中。 4.14 MUL EDI 的结果存在哪里? 答案 :在EDX-EAX中。 4.15 当8-bit 操作数被除时,结果存在哪里? 答案: AX. 4.16 写一个简短的程序, 把BL中的数据除以CL中的数据, 然后把结果加上2,最后的结果存在 DX中, 是16-位数。 答案: MOV AL, BL MOV AH, 0 DIV CL MOV AH, 0 ADD AX, AX MOV DX, AX
相关文章推荐
- 汇编程序语言设计复习题整理
- 汇编语言课程设计(原程序)
- 使用汇编语言编写程序,设计一个用8051单片机控制的循环彩灯控制系统
- 用汇编语言设计接口程序——音乐演奏程序
- 用51单片机汇编语言设计程序,实现一个4位秒表
- 使用Python语言设计基于HTML的C语言语法加亮显示程序
- 谈程序语言的设计及程序员心态
- 汇编语言入门(在debug中编辑和调试程序)
- [汇编语言]程序加载后,ds寄存器的作用是什么?
- 关于汇编语言寄存器和指令操作的整理 2010-05-16 15:22 by Create Chen
- 【整理】高性能的程序该如何设计?
- 汇编语言自学习02_编辑、编译、连接、加载各个阶段的程序的表现形式
- 汇编语言中断程序实例——定时小程序
- 汇编语言(第三版)检测点重点题目整理
- 汇编语言的程序格式
- 关于“设计模式”和“设计程序语言”的一些闲话
- 汇编语言: 试编写一段程序,从键盘接收一个 0-65535 间的十进制无符号数,并在终端上显示与 它等值的二进制数。
- 如何设计插件式结构的程序,兼谈Python语言的动态性
- nasm汇编语言小程序:计算多个指定位置的Fibonacci值
- Assemble汇编语言设计技术