私は 64 ビット アセンブリ コード (yasm) に取り組んでおり、奇妙さや 1 桁としてではなく、正しく読み取れるように、任意に大きな 10 進数値を出力しようとしています。私は周りを見回しましたが、オンラインで適切な解決策を見つけることができないようです. 私のコードは現在、2 値の 10 進数を出力します (商を出力し、10 で割ったときの剰余を出力します)。より大きな値については、10 で繰り返し除算し、剰余がゼロではない間に剰余を出力する do-while ループ構造に沿って考えていました。この方法の問題点は、結果を逆に出力し、これを試行して逆にするためにコードがさらに複雑になることです。うまくいく解決策を知っている人はいますか?aaa、aam などを見てみましたが、それらがどのように機能するのか完全には理解できず、これらは 32 ビット操作でのみ使用できると思われます。
コード構造は次のとおりです。
section .data
nl db "",2,0
nlf db "",10,0
input db '',2,0
fact dq 1
y db 10
store dq 0
rem dq 0
quot dq 0
check dq 0
section .text
global _start
_start:
; reading input value
mov rax, 0 ; system read
mov rdi, 0 ; STD IN
mov rsi, input ; address first byte in output
mov rdx, 1 ; load length into rdx
syscall
; reading newline
mov rax, 0 ; system read
mov rdi, 0 ; STD IN
mov rsi, nl ; address first byte in output
mov rdx, 1 ; load length into rdx
syscall
mov rbx, [input] ; for calculating factorial
sub rbx, '0'
call calc_fact
call de_ASCII_fy
;add rax, 30h
mov rax, 1
mov rdi, 1
mov rsi, nlf
mov rdx, 1
syscall
; exit
xor rdi, rdi
push 0x3c
pop rax
syscall
calc_fact:
cmp bl, 1
jg do_calculation
mov rax, 1
ret
do_calculation:
dec bl
call calc_fact
inc bl
mul bl
ret
de_ASCII_fy:
mov [fact], rax
movzx rax, byte [fact]
cmp rax, 0
je decimal_loop
movzx rbx, byte [y]
xor rdx, rdx
div rbx
xor rcx, rcx
mov rcx, rdx ; store remainder
add rax, '0'
add rdx, '0'
mov [rem], rdx
mov [quot], rax
cmp rcx, 0
jnz full_print
mov rax, 1 ; system write
mov rdi, 1
mov rsi, rem
mov rdx, 1
syscall
ret
full_print:
mov rax, 1 ; system write
mov rdi, 1
mov rsi, quot
mov rdx, 1
syscall
mov rax, 1 ; system write
mov rdi, 1
mov rsi, rem
mov rdx, 1
syscall
jmp endif
endif:ret
decimal_loop:
ret
4 の出力を表示しようとして、階乗値を計算しています! 24と5として!現在、2 つの 10 進数値しか表示できません (何らかの理由で full_print 条件の最初の部分がスキップされるため、3! は 6 ではなく 06 として出力されます) が、24 は正しく出力されます。私は 3 桁の 10 進数値を出力する簡単な方法について頭を悩ませてきましたが、条件付きで非常に面倒になり始めています。