Assembly x86汇编(NASM)十进制>;八进制

Assembly x86汇编(NASM)十进制>;八进制,assembly,x86,nasm,Assembly,X86,Nasm,我正在努力理解这段代码 我看到它将十进制转换为八进制,并以倒序打印八进制值。我没有得到的是ecx先向左移位29位,然后再向后移位的部分。。如果我理解正确的话,操作会导致4位丢失,但这如何有助于计算八进制值。3位不是4位,它们没有丢失,它们是保留的。前29名归零(又名“丢失”)。可以写成和ecx,7,这在各个方面都会更好。记住2^3=8因此这是最低有效的八进制数字。它不是十进制转换,而是二进制到八进制,一次三位。首先将ebx的3个l.s.位右移3位,依此类推。ecx的m.s.29位没有丢失,根本不

我正在努力理解这段代码


我看到它将十进制转换为八进制,并以倒序打印八进制值。我没有得到的是ecx先向左移位29位,然后再向后移位的部分。。如果我理解正确的话,操作会导致4位丢失,但这如何有助于计算八进制值。

3位不是4位,它们没有丢失,它们是保留的。前29名归零(又名“丢失”)。可以写成
和ecx,7
,这在各个方面都会更好。记住
2^3=8
因此这是最低有效的八进制数字。它不是十进制转换,而是二进制到八进制,一次三位。首先将
ebx
的3个l.s.位右移3位,依此类推。ecx的m.s.29位没有丢失,根本不需要。它们仍然存在于
ebx
中,向右移动,每八位数字3位。
call read\u int
子例程已经为您将十进制转换为二进制,剩余的代码正在将二进制转换为八进制。如果它能将真正的十进制(如字符串或BCD编码)转换成八进制,那将是更复杂的代码。
asm_main:
enter   0,0               ; setup routine
pusha
call read_int
    mov ebx,eax
func:
    mov ecx,ebx
    shl ecx,29
    shr ecx,29
    mov eax,ecx
    call print_int
    shr ebx,3
    cmp ebx,0
    ja func
    jmp fin

fin:
    call print_nl
    popa
    mov     eax, 0            ; return back to C
    leave
    ret