汇编语言,请解释

时间:2015-05-24 18:25:44

标签: assembly

我正在学习考试,这让我感到困惑。有谁能解释一下这个?

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.这是为什么?

1 个答案:

答案 0 :(得分:1)

AX是一个x86 16位寄存器。

  1. mov AX,10 ;load 10 into ax.
    的MOVe
    十进制值10从指令操作数复制到寄存器AX AX = 0000 1010(二进制)= 10(十进制)

  2. shl AX,1 ;shift ax left 1 which is 100.
    向左移动 通过从右侧插入1个零位将AX寄存器位向左移位,这是执行乘法2的老技巧 AX = 0001 0100(二进制)= 20(十进制)

  3. add AX,10 ;add 10 which is 110.
    ADD
    将立即值添加到寄存器AX,AX = AX + 10 AX = 0001 1110(二进制)= 30(十进制)

  4. 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

  5. dec ax; decrement ax
    减量
    从AX减去1。 AX = 0001 1101(二进制)= 29(十进制)

  6. 在第一条指令中,数字' 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标志),但很可能只是为了让你迷惑。