mov AX,10 ;load 10 into ax.
shl AX,1 ;shift ax left 1 which is 100.
add AX,10 ;add 10 which is 110.
cmp AX,10 ;this is were i get lost.
dec ax ;decrement ax.
答案是29.这是为什么?
答案 0 :(得分:1)
AX是一个x86 16位寄存器。
mov AX,10 ;load 10 into ax.
的MOVe
将十进制值10从指令操作数复制到寄存器AX
AX = 0000 1010(二进制)= 10(十进制)
shl AX,1 ;shift ax left 1 which is 100.
向左移动
通过从右侧插入1个零位将AX寄存器位向左移位,这是执行乘法2的老技巧
AX = 0001 0100(二进制)= 20(十进制)
add AX,10 ;add 10 which is 110.
ADD
将立即值添加到寄存器AX,AX = AX + 10
AX = 0001 1110(二进制)= 30(十进制)
cmp AX,10 ;this is were i get lost.
比较
从寄存器AX中减去立即值,但不保存结果,只需更新处理器标志即可。用于执行跳跃。
AX = 0001 1110(二进制)= 30(十进制),加上ZF = 0,CF = 0,AF = 0,PF = 0,SF = 0,OF = 0
dec ax; decrement ax
减量
从AX减去1。
AX = 0001 1101(二进制)= 29(十进制)
在第一条指令中,数字' 10'被解释为十进制。通常汇编程序遵循或TASM / NASM / MASM惯例(' 10'是十进制,' 10d'也是十进制,' 10h'是十六进制,' 10o'是八进制,10b是二进制,10是二进制)或C约定(' 10'是十进制,' 0x10'是十六进制,' 010'是八进制,' 0b10'是二进制)或两者。
比较指令只是一个不存储结果的减法。如果你考虑一下,给定两个数字A和B,通过计算AB你可以判断A = B(因为AB是0)还是A> B(AB将是> 0)或A
标志ZF(零标志)和CF(进位标志)只记录最后一次操作产生零结果或需要借入/产生一个进位的事实(看看为什么借用和进位是相同的,只是参考两个补充和全加法器)。 每条指令都要更新一些标志(如add,sub,mul,inc,test,...)或保持不受影响(例如,更新无标志)。
标志用于条件跳转(如ja,jb,je,...)。
顺便说一句,尽管DEC之前的CMP指令并非严格无用(DEC不会更新CF标志),但很可能只是为了让你迷惑。