0

私は 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 進数値を出力する簡単な方法について頭を悩ませてきましたが、条件付きで非常に面倒になり始めています。

4

1 に答える 1