XBOY 发表于 2012-8-15 10:19:01

在网上找的汇编练习题,有几个题比较疑惑,求解(答案在2楼,很详细)

本帖最后由 XBOY 于 2012-8-15 17:18 编辑

3.执行后使BX=0的同时也使CF=0,OF=0的指令是(  a )
  A.XOR BX,BX    B.OR BX,BX
  C.AND BX,BX    D.CMP BX,BX

我选的答案是D,疑惑:什么情况下CMP会使CF,0F不等于0?
------------------------------------------------------------------------------------------
9.完成对CL寄存器的内容乘以4的正确操作是(  c )
  A.ROL CL,1        B.MUL 4
   ROL CL,1

  C.SHL CL,1        D.MOV CL,2
   SHL CL,1             SHL CL,CL

我选的答案是B,疑惑:我知道每逻辑左移一次,相当于乘以2,那MUL指令有什么区别?
------------------------------------------------------------------------------------------------------------------------------------------------------
16.检查二个无符号数的关系,若要实现AL≥BL时分支去LOP1处,那么在“CMP AL,BL”指令后应跟的分支指令是( c  )
  A.JNC LOP1      B.JALOP1
  C.JC LOP1      D.JGELOP1


我选的答案是D,疑惑:为什么是JC而不是JGE呢?如果要是等于的话,那不是没有产生进位??
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
18.设AL=0AH,下列指令执行后能使AL=05H的是(  c )
  A.NOT AL         B.AND AL,0FH
  C.XOR AL,0FH      D.OR AL,0FH

我选的答案是A,疑惑:取反不就是05了么???
----------------------------------------------------------------------------------------------------------------------------------------
19.DA1DW‘AB’,‘CD’,‘EF’,‘GH’(  d )
   ┇
    MOV AX,DA1+3
指令执行后AX中的内容是
  A.‘EF’   B.‘CD’
  C.‘BC’   D.‘FC’

疑惑:偏移3位怎么就是FC了??
-------------------------------------------------------------------------------
答案在2楼,谢谢了,鱼C还是好人多啊!真心感谢,学ASM的路上有你这样的热心人,让我动力更加大了!

lukelqz 发表于 2012-8-15 16:24:43

本帖最后由 lukelqz 于 2012-8-15 16:32 编辑

3、
cmp是比较指令,cmp的功能相当于减法,但是不保存结果,执行后,会对标志寄存器产生影响。
cf是进位标志位,它默认是把数据当作无符号数运算,如果运算的结果的最高有效位向更高位进位或借位,那么,它为1。
of是溢出标志位,默认进行的是有符号数的运算,如果运算结果超出了寄存器所能表示的有符号数的范围,那么,它为1。比如8位寄存器的范围为:-128~127,16位的为-32768~32767 这个知识得比较熟悉补码。

这题cmp本来就不保存结果,bx就不一定为0,所以D不对。要让cf不为0,那么就要cmp前面的参数大于后面的参数。要让of不为0,那么就要有符号数的相减结果,不在-32768~32767这个范围内,因为bx是16位的。

参考资料:王爽《汇编语言》 第11章 标志寄存器
-------------------------------------------------------------------------------------------------------------------------------------
9、
mul指令,如果是8位乘法,那么第一个乘数,默认在AL中,另一个放在8位寄存器或内存单元中,结果默认放在AX中。
如果是16位乘法,那么第一个乘数,默认在AX中,另一个放在16位寄存器或内存单元中,结果默认低8位在AX中,高8位在DX中。

这题要对CL乘以4,直接mul 4显然不对,CL是8位乘法,那么首先要把CL放到AL中,第二mul不能直接后面接数字,必须后面是8位寄存器或者内存单元,语法也错误。

个人觉得mul和移位指令的区别在于,结果的存储地方不同,移位是结果还在本身,mul的结果8位的在ax,16位的在dx和ax中。
还有就是移位感觉要注意溢出的问题。比如cl=1000 0000b。左移一位后,就有溢出问题。结果就不是乘2了。

参考资料:王爽《汇编语言》 P199mul指令
-------------------------------------------------------------------------------------------------------------------------------------
16、
jc为无符号数条件转移指令,功能是 CF=1,也就是低于,转至标号处执行
jnc为无符号数条件转移指令,功能是CF=0,也就是不低于,转至标号处执行
jge为有符号数条件转移指令,功能为大于等于/不小于时转移
ja为无符号数条件转移指令,功能是cf=0且zf=0,也就是高于则转移

这题是无符号数,排除jge,题目要求AL≥BL。也就是al不低于bl,个人觉得选jnc。不知道答案为什么选jc。

参考资料:王爽《汇编语言》 P226 & 汇编金手指
-------------------------------------------------------------------------------------------------------------------------------------
18、
首先AL=0AH 也就是
            AL=00001010B (前面4个零别忘了哦,AL是8位寄存器的撒)
NOT    AL=11110101B(很明显不是05H哇)
XOR    Al,0FH(XOR为异或指令,两个值不同为1,相同为0)
XOR运算演示:
            AL=00001010B
                   00001111B(也就是0FH)
XOR结果=00000101B(结果为05H)
-------------------------------------------------------------------------------------------------------------------------------------
19、
首先DW是按字来存储。
DA1DW‘AB’,‘CD’,‘EF’,‘GH’
编译器把他们翻译为 4142h,4344h,4546h,4748h
但是dw是按字来存储的,高位要放高字节,所以顺序为4241h 4443h 4645h 4847h
DA1+3=CS:偏移为DA1+3的内存存储的数据是4346h
MOV AX,DA1+3      但是存到寄存器里面也是要按高位放高字节的要求来存。所以ax=4643h (也就是FC)
送上DEBUG图:



再送一张把dw改成db的图:


lukelqz 发表于 2012-8-15 17:17:09

{:5_103:}写了一下午{:5_92:}
页: [1]
查看完整版本: 在网上找的汇编练习题,有几个题比较疑惑,求解(答案在2楼,很详细)