7. Little Endian Order 小端方式:存储方式按低字节存放在低地址端高字节存放在高地址端。 8. Intrinsic Data Types 内部数据类型 3.3.判断 1. 对一个正整数,它的原码、反码和补码都一样,也都与无符号数的编码一样。T 2. 常用的BCD码为8421 BCD码,其中的8表示D3位的权重。T 3. IA-32处理器采用小端方式存储多字节数据。T 4. 空操作NOP指令其实根本没有指令。F 5. 堆栈的操作原则是“先进后出”,所以堆栈段的数据除PUSH和POP指令外,不允许其他方法读写。F 6. 虽然ADD指令和SUB指令执行后会影响标志状态,但执行前的标志并不影响它们的执行结果。T 7. 指令“INC ECX”和“ADD ECX,1”的实现功能完全一样,可以互相替换。F 8. 无符号数在前面加零扩展,数值不变;有符号数前面进行符号扩展,位数加长一位、数 值增加一倍。F 9. 逻辑运算没有进位或溢出问题,此时CF和OF没有作用,所以逻辑运算指令如AND、OR等将CF和OF设置为0。T 10. CMP指令是目的操作数减去源操作数,CMPS指令是源操作数减去目的操作数T 11. 指令“DEC ECX”和“SUB ECX,1”的实现功能完全一样,可以互相替换。F 12. 指令“TEST”和“AND”的实现功能完全一样,可以互相替换。F 13. 指令“CMP EAX, ECX”和“SUB EAX, ECX”的实现功能完全一样,可以互相替换。F 14. CPU在实施加减运算时不区分有符号数和无符号数。T 15. VAR是数据段中定义的字变量,指令MOV AL,VAR是正确的。T 3.4.填空 1. (1)定义字节变量的伪指令助记符是 BYTE ,获取变量名所具有的偏移地址的操作符是 OFFSET 。 2. (2)计算机中有一个“01100001”编码。如果把它认为是无符号数,它是10进制数 97 ;如果它是某个ASCII码,则代表字符_ a _。 3. C语言用“\\n”表示让光标回到下一行首位,在汇编语言中需要输出两个控制字符:一个是回车,其ASCII码是 0DH ,它将光标移动到当前所在行的首位;另一个是换行,其ASCII码是 0AH ,它将光标移到下一行。 4. 数据段有语句“H8843 DWORD 99008843H”,代码段指令“MOV CX, WORD PTR H8843”执 行后,CX= 8843H ;代码段指令“MOV CL, BYTE PTR H8843”执行后,CX=_8843H _。 5. 数据段有语句“XYZ DWORD ?”,则XYZ的类型是 DWORD ,用“TYPE XYZ”会得到数值为 4 。 6. 数据段有语句“ABC BYTE 3 DUP (1,2,3)”,代码段指令“MOV CL, ABC+3”执行后,CL= 1 ; “MOV CL, ABC+8”执行后,CL= 3 。 7. 数据段有语句“ABC BYTE 3 DUP (1,2,3)”,代码段指令“MOV AX, WORD PTR ABC”执行后,AX= 0201H ; “MOV EAX, DWORD PTR ABC”执行后,EAX= 01030201H 。 8. 顺序执行指令“XOR EAX, EAX”和“SUB EAX, EAX”后,EAX= 0 ,OF= 0 。 9. 顺序执行指令“XOR EAX, EAX”和“DEC EAX”后,EAX= FFFFFFFFH ,CF= 0 。 10. 欲将EDX内的无符号数除以16,使用指令“SHR EDX, 4 ”; 欲将EAX内的有符号9
数除以16,使用指令“ IDIV 16 ”。 11. 已知:X补=10101100B,Y补=11000110B,则:[X+Y]补= [1]01110010 ,[X-Y]补= 00011000 。 12. 设字长为八位,有x= -1,y=124,则有:[x+y]补= 123 , [x-y] 补= 131 。 13. 已知:寄存器AX=7836H,指令:ADD AX,9A5EH执行后,AX= 1294H CF= 1 。 14. 已知:寄存器AX=7836H,指令:ADD AX,9A5EH执行后,OF= 0 ,SF= 0 。 15. \~\的ASCII码值是 30H~39H ,\~\的ASCII码值是 41H~5AH 。 3.5.简答题 1. 使用二进制8位表达无符号整数,257有对应的编码吗? 答:没有。使用二进制8位表达无符号整数的范围为0~255,因此257没有对应的编码。 2. 字符“'F'”和数值46H作为MOV指令的源操作数有区别吗? 答:字符“'F'”的ASCII码就是数值46H,所以没有区别。 3. 为什么可以把指令“MOV AX, (34+67H)*3”中的数值表达式看成是常量? 答:汇编程序在汇编过程中对数值表达式计算,得到一个确定的数值,故称数值表达式为常量。 4. 数值500,能够作为字节变量的初值吗? 答:不能。数值500大于一个字节所能表达的数据量,所以不能为字节变量赋值。 5. 为什么说“XCHG EDX,CX”是一条错误的指令? 答:源、目标寄存器位数不同,不能用该指令进行数据交换。 6. 都是获取偏移地址,为什么指令“LEA EBX, [ESI]”正确,而指令“MOV EBX, OFFSET[ESI]”就错误? 答:前者在指令执行时获得偏移地址,是正确的;但后者的OFFSET只能在汇编阶段获得偏移地址,但此时寄存器内容是不可知的,所以无法获得偏移地址。 7. INC,DEC,NEG和NOT都是单操作数指令,这个操作数应该是源操作数还是目的操作数? 答:INC,DEC,NEG和NOT指令的操作数既是源操作数也是目的操作数。 8. 大小写字母转换的规律是什么?给出转换的公式。 答:大小写字母转换利用它们的ASCII码相差20H。假设用AX存放所要转换的字母: 大写转小写:ADD AX 20H; 小写转大写:SUB AX 20H 10
第四章 指令系统 4.1.选择 1. 计算机内的“溢出”是指其运算的结果 ( )。 A.无穷大或无穷小 B.超出了内存单元所能存储的数值范围 C.超出了寄存器能存储数值的范围 D.超出了该指令所指定的结果能存储的数值范围 2. 计算机内的“溢出”是指其运算的结果 ( )。 A.无穷大或无穷小 B.超出了内存单元所能存储的数值范围 C.超出了寄存器能存储数值的范围 D.超出了该指令所指定的结果能存储的数值范围 3. 16位二进制无符号数的数值范围是( )。 A.0 ~ 65535 B.0 ~ 65536 C.0~ 32767 D.0 ~ 32768 4. 最大的10位无符号二进制整数转换成十进制数是 。 A. 51 B. 512 C. 1023 D. 1024 A.ZF B. SF C.CF D. TF 6. INC 指令不能影响标志寄存器的( )位。 A.ZF B. SF C.CF D. DF 7. DEC 指令不能影响标志寄存器的( )位。 A.ZF B. SF C.CF D. IF 8. 在执行DIV或IDIV指令发生错误时会产生( )中断。 A.线路故障 B.内部 C.外部 D.单步 9. 在执行ADD或SUB指令发生溢出错误时( )。 A.不产生任何中断 B. 会产生内部中断 C. 会产生外部中断 D. 会产生单步中断 10. 完成同指令XCHG AX,BX相同功能的指令或指令序列是( )。 A. MOV AX,BX B. MOV BX,AX C. PUSH AX D. MOV CX,AX POP BX MOV AX,BX MOV BX,CX 11. 顺序执行PUSH EAX和POP EBX两条指令,其功能等同于( ) A.MOV EAX, EBX B.MOV EBX, EAX C.XCHG EAX, EBX D.XCHG EBX, EAX 12. 目前在微机中最普遍采用的字符的编码是( )。 A.BCD码 B.ASCII码 C.余三码 D.格雷码 13. 已知X、Y的补码分别为11101011B、00001010B,求X+Y的补码等于( )。 A. 10100001B B. 11011111B C. 11110101B D. 溢出 14. 计算机中( )不能直接表示有符号数。 A.原码 B.补码 C.反码 D.BCD码 15. 下列字母中,ASCII码值最小的是( ) 。 A. K B. Y C. a D. i 11
16. 当执行完下列指令序列后,标志位CF和SF的值为( )。 MOV AL,0C4H ADD AL,9DH A. 0,0 B. 0,1 C. 1,0 D. 1,1 4.2.名词解释 1. Program flow control instructions : 程序流程控制指令 2. OFFSET Operator: 在汇编阶段取得变量的偏移地址。 3. Loop Counter: 循环计数器,一般用ECX作计数器,在LOOP循环中每次减1。 4. Pseudo Code: 伪代码,又称虚拟代码,是高层次描述算法的一种。 5. Single Dimension Array:一位数组 6. Conditional Loop Instructions:条件循环指令利,用条件转移指令决定是否进行循环。 7. Arithmetic instructions:算数指令 8. Jumps Based on Unsigned Comparisons:无条件转移比较 4.3.判断 1. VAR是数据段中定义的字变量,指令MOV AX,VAR+2是正确的。T 2. VAR1和VAR2是数据段中定义的字变量,指令MOV AX, VAR1-VAR2是正确的。T 3. VAR1和VAR2是数据段中定义的字变量,指令MOV AX, VAR1+VAR2是正确的。F 4. 执行乘法指令IMUL src时,运算结果不会产生溢出。T 5. 执行乘法指令IMUL REG,src时,运算结果不会产生溢出。F 6. 定义符号常量时,使用“=”与“EQU”没有区别。F 7. 地址操作符OFFSET可以获取任何寻址方式的内存变量的有效地址。F 8. 指令“SHL”与“SAL”的功能是等价的。T 9. 指令“SHR”与“SAR”的功能是等价的。F 10. 指令“LOOP Lable ”与“DEC ECX JNZ Lable”的功能是等价的。F 11. 32位机不能完成64位整数加法运算。F 12. 只有补码才能表示有符号数。F 13. 指令“LEA”可以获取任何寻址方式的内存变量的有效地址。T 14. 指令“LEA”可以实现求两个寄存器与一个立即数三个数之和的功能。T 15. 堆栈内部中的数据是无法修改的。F 4.4.填空 1. 顺序执行指令“XOR EAX, EAX”和“SUB EAX, 1”后,EAX= FFFFFFFFH ,CF= 1 。 2. 数据段有语句“BUF DWORD 10h DUP( 3 DUP( 2,? ) ,3 ,4 ,5)”,则用“LENGTHOF BUF”会得到数值为 144 ,用“SIZEOF BUF”会得到数值为 576 _。 3. 已知AL=01100001B,执行指令“AND AL,5FH”后,AL= 41H ;如果AL的内容是某个ASCII码,则代表字符 A 。 4. 已知AL=01000001B,执行指令“OR AL,20H”后,AL= 61H _;如果AL的内容是某个ASCII码,则代表字符 a 。 5. 设字长为八位,-128补= 80 _H, -1补= FF H。 6. 已知:寄存器AX=7836H,指令:TEST AX,9A5EH执行后,OF= 0 ,SF= 0 。 12
7. 已知:寄存器AX=7836H,指令:CMP AX,9A5EH执行后,AX= 7836 H ,OF= 1_。 8. 要测试AX的第五位是否为1,使用指令 AND AX 0020 H ;若要将AL的第五位置为1,使用指令 OR AL 002O H 。(说明:最低位为第0位。) 9. 已知:寄存器AX=9A5EH,指令: NEG AX执行后,OF= 0 ,SF= 0 。 10. 已知:寄存器EAX=65536,EBX=32768,指令:DIV EBX执行后,EAX=2。则指令:DIV EBX执行前EDX的值应为 0 ,指令:DIV EBX执行后EDX=__0__。 11. 已知:寄存器AL=-1,指令:MOVSX BX,AL执行后,BX= __FFFF__H;指令:MOVZX CX,AL执行后,CX= __00FF__H。 12. 顺序执行指令序列“XOR EAX,EAX ,DEC EAX , ADC EAX,0”后,CF=_0_,ZF=_0_。 13. 顺序执行指令序列“XOR EAX,EAX ,SUB EAX,1 ,ADC EAX,0”后,CF=_1_,ZF=_1__。 14. 已知:寄存器AL=10,BL=-10,指令:MUL BL执行后,AX=__099C__H;而若将指令改为:IMUL BL 则执行后AX=__FF9C__H; 15. 若要将AX的第五位和第九位置为0,使用指令__AND AX ,FDDF H__;若要将AX的第五位和第九位置反,使用指令___XOR AX ,0220 H___。(说明:最低位为第0位。) 4.5.简答题 1. 乘除法运算针对无符号数和有符号数,有两种不同的指令。只有一种指令的加减法如何区别无符号数和有符号数运算? 答:加减法不区别无符号数和有符号数,但根据运算结果分别设置标志寄存器的CF和是SF标志,可利用CF和SF进行区别。 2. 逻辑与运算为什么也称为逻辑乘? 答:逻辑与运算规则是:1^1=1,其他均为0,逻辑与运算规则类似二进制的乘法,所以称其为逻辑乘。 3. 简述逻辑运算指令怎么实现复位、置位和求反功能? 答:实现复位指令:AND AX 0 ;将AX里的数值为0 实现置位指令:OR AX FFFF ;给预置位置为1再与要比较的数作OR运算 实现求反指令:XOR AX FFFF ;将目的操作数与全1作异或运算。 4. 在处理一维数组时,通常可以采用哪些寻址方式?各自的特点是什么? 答:立即数寻址:指令需要的操作数紧跟在操作码之后作为机器指令代码的一部分并随着处理器的取指操作从主存进入指令寄存器。 特点:速度快不需要转换地址,但寻址范围小; 寄存器寻址:指令的操作数存放在处理器的寄存器中。 特点:寻址方式简单快捷,是最常使用的寻址方式; 存储器寻址:寻址主存中存储的操作数就称为存储器寻址。 特点:需要至少两次访存,寻址方式多,地址范围大。 5. 通常在什么情况下需要使用MOVSX、MOVZX指令? 答:对无符号数,在前面加零实现零位扩展。对应指令MOVZX;对有符号数进行符号扩展,即用一个操作数的符号位(最高位)形成另一个操作数,对应指令MOVSX。 6. 通常在什么情况下需要使用PTR类型操作符?举例说明。 答:如在指令“MOV EAX,DWORD PTR ARRAY”,EAX是双字,变量ARRAY被定义为字量,两者类型不同,MOV指令不允许不同类型的数据传送,利用PTR改变ARRAY的类型,将其传送给EAX. 7. ESP是通用寄存器,是否可以随意的修改ESP的值? 答:不可以,堆栈段的范围由堆栈执政寄存器ESP的初值确定,这个位置就是堆栈的底13