如何更改此代码,以便仅将零标志专门设置为大于FFFDh?

时间:2014-04-13 23:52:17

标签: assembly compiler-construction x86

我正在尝试获得大于-3的第一个值, 但是我坚持使用这行代码:

cmp WORD PTR [esi],FFFDh            ; test sign bit
pushfd                              ; push flags on stack
add  esi,TYPE array
popfd                               ; pop flags from stack
loopnz next                         ; continue loop

如果我执行cmp操作,则仅在WORD PTR [esi] = FFFDh时设置零标志 只有当WORD PTR [esi]大于或小于FFFDh时,此循环才会停止。 如何更改此代码,以便仅将零标志专门设置为大于FFFDh。

.data
array  SWORD  -3,-6,-1,-10,10,30,40,4
sentinel SWORD  0

.code
main PROC
    mov esi,OFFSET array
    mov ecx,LENGTHOF array

next:
    cmp WORD PTR [esi],FFFDh            ; test sign bit
    pushfd                              ; push flags on stack
    add  esi,TYPE array
    popfd                               ; pop flags from stack
    loopnz next                         ; continue loop

    jnz  quit                           ; none found
    sub  esi,TYPE array                 ; ESI points to value

1 个答案:

答案 0 :(得分:0)

没有简单的方法可以使用零标志。你应该使用循环中的条件跳转。顺便提一下,您还可以摆脱pushfd / popfd和后循环esi调整:

next:
    cmp WORD PTR [esi],FFFDh
    jg found
    add  esi,TYPE array
    loop next                         ; continue loop
    jmp quit
found:
    ; ESI points to value

PS:确保LENGTHOF以元素数而非字节数返回数组大小,因为您将其用作迭代计数。