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



我在一个用于循环的单词中放置了一个计数器,我使用:

cmp       word [counter], nbIter
jge       end

但由于某种原因,它只适用于nbIter小于0x8000。当超过这个数字时,在第一次迭代时跳到末尾。

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

下面是我的完整代码:
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用于无符号比较

相关内容

  • 没有找到相关文章

最新更新