在网上找的汇编练习题,有几个题比较疑惑,求解(答案在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: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的图:
{:5_103:}写了一下午{:5_92:}
页:
[1]