Assembly 为什么输入新标签时rcx会刷新?
我是NASM新手,正在尝试将16位二进制转换为十进制 代码如下所示: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
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,商:r11rcx
是根据调用约定保存的调用方寄存器printf
被允许修改它。那么我是否使用了其他可以工作的寄存器?编辑:刚刚看到链接。非常感谢@Jesterimul r12,2
真的吗?像正常人一样使用shl r12,1
。还要注意,1001101010011010
是十进制的。您忘记了一个0y
或0b
前缀或y
/b
后缀来告诉汇编程序位置值是以2为基数,而不是以10为基数。非常感谢,@PeterCordes。我不知道可以使用0b
直接输入二进制,因为NASM中的前缀(首先不需要将其转换为十进制)会记住您的建议。再次感谢:这里没有必要这样做,这是你永远不应该做的事情dq 39578
与dq 0b1001101010011010完全相同,只是两种不同的源代码级别写入相同数值的方法。当十进制数不能用64个二进制位表示时,将其写入大十进制数将失败。rcx
是根据调用约定保存的调用方寄存器printf
被允许修改它。那么我是否使用了其他可以工作的寄存器?编辑:刚刚看到链接。非常感谢@Jesterimul 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