Assembly 为什么输入新标签时rcx会刷新?

Assembly 为什么输入新标签时rcx会刷新?,assembly,x86-64,nasm,Assembly,X86 64,Nasm,我是NASM新手,正在尝试将16位二进制转换为十进制 代码如下所示: extern printf SECTION .data fmt: db "The resultant BCD is: ", 0 fmtshort: db "%lu ", 0 binary: dq 1010 ; 16 bit binary number (8 byte int) = 10011

我是NASM新手,正在尝试将16位二进制转换为十进制

代码如下所示:

        extern printf
        SECTION .data


fmt:    db  "The resultant BCD is: ", 0
fmtshort:   db  "%lu    ", 0

binary: dq  1010                    ; 16 bit binary number (8 byte int) = 1001101010011010
msb:    dq  0                       ; most significant bit size int msv = 0 (initially)
divider:    dq  1                   ; used to isolate the msb of the decimal;

        SECTION .text               ; code section
        global main

main:
    push rbp                    ; base pointer
    mov rcx,[binary]                    ; loading it into binary value
    mov r14,0                   ; decimal(initially) = 0;
    mov r13,0                   ; counter(i) = 0;
    mov r15,0                   ; r15 = 0;
    mov rdi,fmt                 ; storing format in the 1st register
    call printf                 ; calling printf
    jmp getFromBinary               ; Jump to condition first

cgetFromBinary:
    mov rdx,0
    mov rax,rcx
    mov rbx,10
    div rbx
    mov rcx,rax                 ; remainder: rdx, quotient: r11 <- rax
    mov rax,r13                 ; rax = i
    mov r12,1                   ; result of 2^i
    jmp loop1                   ; calculate 2^i
cloop1:
    imul r12,2                  ; multiply r12 *= 2
    dec rax                     ; rax--
loop1:
    cmp r15,rax                 ; 0 < rax?
    jl cloop1                   ; jump if met

    imul rdx,r12                    ; multiply remainder *= 2^i
    add r14,rdx                 ; add decimal += remainder
    inc r13                     ; i++

getFromBinary:
    cmp rcx,0                   ; is binary == 0? 
    jnz cgetFromBinary              ; jump if condition is met

    mov rdi,fmtshort                ; store the format
    mov rsi,r14                 ; store the 1st printf var
    call printf                 ; call printf


ending:           
        pop rbp         ; pop the stack
        mov rax,0       ; exit code
        ret             ; return to OS from main
如何在不同的标签中使用rcx

编辑: 通过修改代码,我能够通过使用变量本身来解决它:

        extern printf
        SECTION .data


fmt:    db  "The resultant BCD is: ", 0
fmtshort:   db  "%lu    ", 0

binary: dq  1001101010011010                    ; 16 bit binary number (8 byte int) = 1001101010011010
msb:    dq  0                       ; most significant bit size int msv = 0 (initially)
divider:    dq  1                   ; used to isolate the msb of the decimal;

        SECTION .text               ; code section
        global main

main:
    push rbp                    ; base pointer
    mov rcx,[binary]                    ; loading it into binary value
    mov r14,0                   ; decimal(initially) = 0;
    mov r13,0                   ; counter(i) = 0;
    mov r15,0                   ; r15 = 0;
    mov rdi,fmt                 ; storing format in the 1st register
    call printf                 ; calling printf
    jmp getFromBinary               ; Jump to condition first

cgetFromBinary:
    mov rdx,0
    mov rax,[binary]
    mov rbx,10
    div rbx
    mov [binary],rax                    ; remainder: rdx, quotient: r11 <- rax
    mov rax,r13                 ; rax = i
    mov r12,1                   ; result of 2^i
    jmp loop1                   ; calculate 2^i
cloop1:
    imul r12,2                  ; multiply r12 *= 2
    dec rax                     ; rax--
loop1:
    cmp r15,rax                 ; 0 < rax?
    jl cloop1                   ; jump if met

    imul rdx,r12                    ; multiply remainder *= 2^i
    add r14,rdx                 ; add decimal += remainder
    inc r13                     ; i++

getFromBinary:
    mov rcx,[binary]
    cmp rcx,0                   ; is binary == 0? 
    jnz cgetFromBinary              ; jump if condition is met

    mov rdi,fmtshort                ; store the format
    mov rsi,r14                 ; store the 1st printf var
    call printf                 ; call printf


ending:           
        pop rbp         ; pop the stack
        mov rax,0       ; exit code
        ret             ; return to OS from main
extern printf
第二节数据
fmt:db“结果BCD为:”,0
fmtshort:数据库“%lu”,0
二进制:dq1001101010011010;16位二进制数(8字节整数)=1001101010011010
msb:dq0;最高有效位大小int msv=0(初始)
除法器:dq1;用于隔离十进制的msb;
第节.案文;代码段
全球主要
主要内容:
推动rbp;基指针
mov-rcx,[二进制];将其加载到二进制值中
mov-r14,0;十进制(最初)=0;
mov-r13,0;计数器(i)=0;
mov-r15,0;r15=0;
mov-rdi,fmt;在第一个寄存器中存储格式
调用printf;调用printf
jmp-getFromBinary;先跳到条件
cgetFromBinary:
mov-rdx,0
mov-rax[二进制]
mov rbx,10
分区rbx

mov[binary],rax;余数:rdx,商:r11
rcx
是根据调用约定保存的调用方寄存器
printf
被允许修改它。那么我是否使用了其他可以工作的寄存器?编辑:刚刚看到链接。非常感谢@Jester
imul r12,2
真的吗?像正常人一样使用shl r12,1
。还要注意,
1001101010011010
是十进制的。您忘记了一个
0y
0b
前缀或
y
/
b
后缀来告诉汇编程序位置值是以2为基数,而不是以10为基数。非常感谢,@PeterCordes。我不知道可以使用
0b
直接输入二进制,因为NASM中的前缀(首先不需要将其转换为十进制)会记住您的建议。再次感谢:这里没有必要这样做,这是你永远不应该做的事情
dq 39578
与dq 0b1001101010011010完全相同,只是两种不同的源代码级别写入相同数值的方法。当十进制数不能用64个二进制位表示时,将其写入大十进制数将失败。
rcx
是根据调用约定保存的调用方寄存器
printf
被允许修改它。那么我是否使用了其他可以工作的寄存器?编辑:刚刚看到链接。非常感谢@Jester
imul r12,2
真的吗?像正常人一样使用shl r12,1。还要注意,
1001101010011010
是十进制的。您忘记了一个
0y
0b
前缀或
y
/
b
后缀来告诉汇编程序位置值是以2为基数,而不是以10为基数。非常感谢,@PeterCordes。我不知道可以使用
0b
直接输入二进制,因为NASM中的前缀(首先不需要将其转换为十进制)会记住您的建议。再次感谢:这里没有必要这样做,这是你永远不应该做的事情
dq 39578
与dq 0b1001101010011010完全相同,只是两种不同的源代码级别写入相同数值的方法。当十进制数不能用64个二进制位表示时,将其作为一个巨大的十进制数写入较大的数字将失败。
        extern printf
        SECTION .data


fmt:    db  "The resultant BCD is: ", 0
fmtshort:   db  "%lu    ", 0

binary: dq  1001101010011010                    ; 16 bit binary number (8 byte int) = 1001101010011010
msb:    dq  0                       ; most significant bit size int msv = 0 (initially)
divider:    dq  1                   ; used to isolate the msb of the decimal;

        SECTION .text               ; code section
        global main

main:
    push rbp                    ; base pointer
    mov rcx,[binary]                    ; loading it into binary value
    mov r14,0                   ; decimal(initially) = 0;
    mov r13,0                   ; counter(i) = 0;
    mov r15,0                   ; r15 = 0;
    mov rdi,fmt                 ; storing format in the 1st register
    call printf                 ; calling printf
    jmp getFromBinary               ; Jump to condition first

cgetFromBinary:
    mov rdx,0
    mov rax,[binary]
    mov rbx,10
    div rbx
    mov [binary],rax                    ; remainder: rdx, quotient: r11 <- rax
    mov rax,r13                 ; rax = i
    mov r12,1                   ; result of 2^i
    jmp loop1                   ; calculate 2^i
cloop1:
    imul r12,2                  ; multiply r12 *= 2
    dec rax                     ; rax--
loop1:
    cmp r15,rax                 ; 0 < rax?
    jl cloop1                   ; jump if met

    imul rdx,r12                    ; multiply remainder *= 2^i
    add r14,rdx                 ; add decimal += remainder
    inc r13                     ; i++

getFromBinary:
    mov rcx,[binary]
    cmp rcx,0                   ; is binary == 0? 
    jnz cgetFromBinary              ; jump if condition is met

    mov rdi,fmtshort                ; store the format
    mov rsi,r14                 ; store the 1st printf var
    call printf                 ; call printf


ending:           
        pop rbp         ; pop the stack
        mov rax,0       ; exit code
        ret             ; return to OS from main