nasm x86-64,超值时单词比较问题

nasm x86-64, problem with word comparison when exceeding value

我有一个用于循环的词的计数器,为了结束我使用的循环:

cmp       word [counter], nbIter
jge       end

但出于某种原因,它仅适用于 nbIter 小于 0x8000 的情况。 当超过这个数字时,它会在第一次迭代时跳到最后。

我尝试使用两个字节作为计数器并将第二个字节与 0x80 进行比较,但结果相同。我增加的时候还把counter当成一个词,不知道是不是跟没做任何改变一样。

这是我的完整代码:

SECTION     .data
message:    db 13, '0', '0', '.', '0', '0', '0'

msglen:     equ $-message

compteur:   dw 0

timeval:    ; struct needed to call nanosleep system call
  dq 0      ; seconds, dq means "define quadwords" = integers on 8 bytes
  dq 1000000    ; nanoseconds

SECTION     .text
  GLOBAL    _start

_start:
  jmp       loop

loop:
  call      resetreg
  mov           cx, 10          ; diviseur
  mov       rbx, 7
  mov       ax, [compteur]
offset:
  dec       rbx
  cmp       rbx, 3
  je        offset
  xor       rdx, rdx
  div       cx      ; quotient dans ax, reste dans dx
  add       dl, '0'
  mov       [rbx+message], dl
  cmp       ax, 0
  jg        offset
                ; push les registres qu'on risque de modifier
  call      print
  call      pause
                ; pop les registres qu'on a push pour récup leur valeurs

  inc       word [compteur]
  cmp       word [compteur], 0x7fff
  jge       end
  jmp       loop

end:
  call      skipline
  mov       rax, 60     ; system call for exit
  mov       rdi, 0      ; exit code 0, equiv to xor rdi, rdi
  syscall           ; invoke operating system to exit

pause:
  mov       rax, 35         ; syscall nanosleep for x86_64, see man nanosleep
  mov       rdi, timeval    ; pointing to struct encoding duration of sleep
  mov       rsi, 0          ; null means 2nd parameter not used
  syscall
  ret

print:
  mov       rax, 1      ; system call for write
  mov       rdi, 1      ; file handle 1 is stdout
  mov       rsi, message    ; address of string to output
  mov       rdx, msglen ; number of bytes
  syscall               ; invoke operating system to do the write
  ret

resetreg:
  xor       rax, rax
  xor       rbx, rbx
  xor       rcx, rcx
  xor       rdx, rdx
  ret

skipline:
  mov       word [message+1], 0x0a00
  mov       dword [message+3], 0x00000000
  call      print
  ret

jge 是有符号比较的跳转,您可能正在寻找 jae 进行无符号比较