ASSEMBLER Odczytanie wartości z klawiatury, wykonanie działania i wyświetlenie wartości

0

Cześć,
mam problem z prostym programem w assemblerze (Linux). Chciałbym wczytać jakąś liczbę z klawiatury, wykonać na niej jakieś działanie arytmetyczne (np. dodawanie, odejmowanie, to bez znaczenia) i wyświetlić jej wartość. Niby trywialny problem, ale nie wiem za bardzo jak się do tego zabrać.
To mój kod:

SYSEXIT = 1
EXIT_SUCC = 0
SYSWRITE = 4
SYSCALL = 0x80
SYSREAD = 3

.data
value: .space 5, 0
value_len: .long .-value

result: .long
result_len: .long .-result

.text
.global _start

_start:


movl $SYSREAD, %eax
movl $EXIT_SUCC, %ebx
movl $value, %ecx
movl value_len, %edx
int $SYSCALL

movl $0, %edx
movl value_len, %ecx

for:                            
    movb value(, %edx, 1), %al
    subb $48, %al
    movb %al, result(, %edx, 1)
    inc %edx    
loop for    

add $10, result

movl $0, %edx
movl result_len, %ecx

for1:                           
    movb result(, %edx, 1), %al
    add $48, %al
    movb %al, result(, %edx, 1)
    inc %edx    
loop for1

movl $SYSWRITE, %eax            
movl $SYSEXIT, %ebx 
movl $result, %ecx
movl result_len, %edx
int $SYSCALL

movl $SYSEXIT, %eax
movl $EXIT_SUCC, %ebx
int $SYSCALL

W analogiczny sposób zaprojektowałem działający program z szyfrem Cezara oraz program zmieniający w ciągu wprowadzonym z klawiatury litery z małych na duże i na odwrót, jednak z liczbami jest trochę inaczej bo chyba nie można ich zapisywać do zmiennej jak ja to robię.
Miałem inny pomysł, aby brać po jednej cyfrze i mnożyć ją *10k albo brać cyfrę i mnożyć jej bity *2k zaczynając od najmłodszego (k = 0,1,2,...,n). Problem w tym, że nie wiem jak to zrealizować i czy to w ogóle są dobre pomysły.

Z góry dziękuję za pomoc i pozdrawiam.

0

przekonwertować ją do wartości

Cyfra 0 to w ASCII 48, cyfra 1 to 49 i tak dalej.
Teraz wystarczy zauważyć, że:
123=1*100 + 2*10 + 3*1
1024=1*1000 + 0*100 + 2*10 + 4*1
(...)

Nasuwa Ci się jakiś pomysł?

0

tylko jak to zaimplementować w assemblerze

No jak to jak.

Przećwicz najpierw dwa zagadnienia:
• Jak zrobić pętlę?
• Jak mnożyć?

A teraz je połącz:
• Jak mnożyć w pętli?

0

Czy myślicie, że taka konwersja jest poprawna?

movl liczba_len, %ecx
mov $1, %eax
movl $0, wynik

	push %ebx			        
	mov liczba(, %ecx, 1), %edx	
	sub $48, %edx			        
	mull %edx			        
	mov %ebx, %ecx			
	pop %ebx			        
	add %ebx, wynik			
	mov $10, %ebx			
	mull %ebx			        

1 użytkowników online, w tym zalogowanych: 0, gości: 1