我正在使用64位彙編代碼(yasm),試圖輸出任意大的十進制值,以便它們正確讀取,而不是作爲怪異或單個數字。我看了一下,但似乎無法找到任何合適的解決方案。我的代碼當前輸出一個2值十進制數字(輸出商,輸出餘數除以10)。對於較大的值,我正在考慮一個do-while循環結構的線路,它將重複地除以10並輸出餘數,而餘數不爲零。這種方法的問題在於它會反向輸出結果,給代碼添加了額外的複雜性,試圖將其反轉。有誰知道可以工作的解決方案?我看了一下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!現在,目前我只能顯示兩個十進制值(出於某種原因full_print條件的第一部分被跳過,所以3!被打印爲06而不是6),但是24被正確打印。我一直在爲打印出3位十進制值的簡單方法而絞盡腦汁,但它開始變得非常混亂。
第一種方法是最常見的。您可以在第一個循環中將剩餘部分「推」到堆棧中,然後在第二個循環中「彈出」並打印/存儲它們。由於堆棧被組織爲LIFO-Memory,因此您可以以相反的順序輕鬆獲取數字。 – rkhb 2014-09-13 19:43:22
你能告訴我們一些代碼嗎? – 2014-09-14 08:30:57