Šta je novo?

Asemmbly osnova

MostWanted

Cenjen
Učlanjen(a)
12.07.2013
Poruke
668
Poena
195
Moja oprema  
CPU & Cooler
Ryzen 5600 & BeQuiet Pure Rock Slim 2
Matična ploča
Asus B550-PRO
RAM
16GB DDR4 3200MHz Kingston
GPU
MSI Radeon 6700XT 12GB
Storage
1TB nvme SSD Kingston
Zvuk
Tannoy Gold 5
PSU
Fractal ION Gold 750W
Kućište
Cooler Master Silencio S600 + BeQuiet Silent Wings 3 120mm
Monitor
LG UltraGear 27'' 1440p 165Hz
Miš & tastatura
Logitech G Pro tastatura i mis
Potrebna mala pomoc oko jednostavnog assembly programa koji sabira dva jednocifrena broja, za faks...
eax i ebx su 2 unete cifre, ecx rezultat. Ispod je ceo kod, sve sto treba da uradim je da prepravim da moze da izbaci rezultat kada je dvocifreni broj, za sada moze samo kada je jednocifreni, do 10. Znaci 9+9 ne moze. Rezultat bi trebalo biti prikazan kao broj u rangu 00-18, uvek dvocifreni. Pojma nemam o assembly-ju a slab sam sa vremenom trenutno pa bi mi jako znacila mala pomoc ovde :)

Kod:
;  Constants
	cr equ 13 ; Vognretur
	lf equ 10 ; Linjeskift
	SYS_EXIT equ 1
	SYS_READ equ 3
	SYS_WRITE equ 4
	STDIN equ 0
	STDOUT equ 1
	STDERR equ 2

; Datasegment
section .bss
	siffer resb 4

; Datasegment
	section .data
		meld db "Skriv to ensifrede tall skilt med mellomrom.",cr,lf
	db "Summen av tallene maa vaere mindre enn 10.",cr,lf
	meldlen equ $ - meld
	feilmeld db cr,lf, "Skriv kun sifre!",cr,lf
	feillen equ $ - feilmeld
	crlf db cr,lf
	crlflen equ $ - crlf
Skriv to ensifrede tall skilt med mellomrom
; Kodesegment med program
section .text

global _start
_start:
	mov edx,meldlen
	mov ecx,meld
	mov ebx,STDOUT
	mov eax,SYS_WRITE
	int 80h
	; Les tall, innlest tall returneres i ecx
	; Vellykket retur dersom edx=0
	call lessiffer
	cmp edx,0 ; Test om vellykket innlesning
	jne Slutt ; Hopp tilavslutning ved feil i innlesing
	mov eax,ecx ; Første tall/siffer lagres i reg eax
	call lessiffer
	; Les andre tall/siffer
	; vellykket: edx=0, tall i ecx
	cmp edx,0 ;Test om vellykket innlesning
	jne Slutt
	mov ebx,ecx ; andre tall/siffer lagres i reg ebx
	call nylinje
	add eax,ebx
	mov ecx,eax
	call skrivsiffer ; Skriv ut verdi i ecx som ensifret tall

Slutt:
	mov eax,SYS_EXIT
	mov ebx,0
	int 80h

; ---------------------------------------------------------
skrivsiffer:
	; Skriver ut sifferet lagret i ecx. Ingen sjekk på verdiområde.
	push eax
	push ebx
	push ecx
	push edx
	add ecx,'0' ; converter tall til ascii.
	mov [siffer],ecx
	mov ecx,siffer
	mov edx,1
	mov ebx,STDOUT
	mov eax,SYS_WRITE
	int 80h
	pop edx
	pop ecx
	pop ebx
	pop eax
	ret

; ---------------------------------------------------------
lessiffer:
	; Leter forbi alle blanke til neste ikke-blank
	; Neste ikke-blank returneres i ecx
	push eax
	push ebx
Lokke:
	; Leser et tegn fra tastaturet
	mov eax,SYS_READ
	mov ebx,STDIN
	mov ecx,siffer
	mov edx,1
	int 80h
	mov ecx,[siffer]
	cmp ecx,' '
	je Lokke
	cmp ecx,'0' ; Sjekk at tast er i område 0-9
	jb Feil
	cmp ecx,'9'
	ja Feil
	sub ecx,'0' ; Konverter ascii til tall.
	mov edx,0 ; signaliser vellykket innlesning
	pop ebx
	pop eax
	ret ; Vellykket retur
Feil:
	mov edx,feillen
	mov ecx,feilmeld
	mov ebx,STDERR
	mov eax,SYS_WRITE
	int 80h
	mov edx,1 ; Signaliser mislykket innlesning av tall
	pop ebx
	pop eax
	ret ; Mislykket retur

; ---------------------------------------------------------
; Flytt cursor helt til venstre på neste linje
nylinje:
	push eax
	push ebx
	push ecx
	push edx
	mov edx,crlflen
	mov ecx,crlf
	mov ebx,STDOUT
	mov eax,SYS_WRITE
	int 80h
	pop edx
	pop ecx
	pop ebx
	pop eax
	ret

; End _start
 
Davno sam ovo radio tako da mozda nije tacno :)

Ovo je kako vidim x86. Probaj da posle
Kod:
add eax,ebx
dodas
Kod:
adc eax,0
 
Nope, nije to :) Googlam malo i koliko vidim, problem nastaje kada konvertujem u ASCII zato sto od 1-9 mogu da dodam 48 da dobijem ascii kod, dok ako na 10 dodam 48 dobijem ascii kod za ";". Pojma nemam kako da resim ovo
 
Možeš da podeliš broj na cifre, pa da konvertuješ svaku posebno.
 
Treba da simuliraš bit za prenošenje (carry). Šta je rezultat 9+9? Trebalo bi da bude 8, a 1 se prenosi na sabirke ulevo.

Sent from my Pixel 2 XL using Tapatalk
 
Nazad
Vrh Dno