我在 Linux 上的英特尔处理器上用 asm x64 编写了这段代码,它应该计算 RDI 内容的位数并将结果返回到 RAX。它只是将 RAX 除以 10,直到 RAX 等于 0(直到商等于 0)。在每个循环中,RCX 都会增加:
bits 64
global _start
section .text
_start:
mov rdi,1234
push rcx
push rsi
push rdx
mov rsi,0xa
mov rax,rdi
xor rcx,rcx
func_loop:
cmp rax,0x0
jz func_fin
inc rcx
div rsi
jmp func_loop
func_fin:
mov rax,rcx
pop rdx
pop rsi
pop rcx
mov rax,0x3c ; sys_exit
mov rdi,0x0
syscall
执行时,程序似乎处于无限循环中...... GDB 告诉我:
你能告诉我为什么 RAX 内容突然从 123 变为 7378697629483820658 吗?我误解了 DIV 指令的使用吗?
感谢大家对此的关注。