|
发表于 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图:
再送一张把dw改成db的图:
|
评分
-
查看全部评分
|