鱼C论坛

 找回密码
 立即注册
查看: 2539|回复: 2

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

[复制链接]
发表于 2012-8-15 10:19:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 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.JA  LOP1
  C.JC LOP1      D.JGE  LOP1


我选的答案是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.DA1  DW‘AB’,‘CD’,‘EF’,‘GH’(  d )
     ┇
    MOV AX,DA1+3
  指令执行后AX中的内容是
  A.‘EF’   B.‘CD’
  C.‘BC’   D.‘FC’

疑惑:偏移3位怎么就是FC了??
-------------------------------------------------------------------------------
答案在2楼,谢谢了,鱼C还是好人多啊!真心感谢,学ASM的路上有你这样的热心人,让我动力更加大了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 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了。

参考资料:王爽《汇编语言》 P199  mul指令
-------------------------------------------------------------------------------------------------------------------------------------
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是按字来存储。
DA1  DW‘AB’,‘CD’,‘EF’,‘GH’
编译器把他们翻译为 4142h,4344h,4546h,4748h
但是dw是按字来存储的,高位要放高字节,所以顺序为4241h 4443h 4645h 4847h
DA1+3=CS:[DA1+3]  偏移为DA1+3的内存存储的数据是4346h
MOV AX,DA1+3      但是存到寄存器里面也是要按高位放高字节的要求来存。所以ax=4643h (也就是FC)
送上DEBUG图:
19.png


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

192.png

评分

参与人数 1鱼币 +3 收起 理由
XBOY + 3 有图有真相,谢谢你辛苦了!!!感谢你的详.

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-8-15 17:17:09 | 显示全部楼层
写了一下午
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-8 04:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表