Portál AbcLinuxu, 10. května 2025 03:24

Dotaz: assembler secteni cisla

15.1.2006 02:45 _change
assembler secteni cisla
Přečteno: 430×
Odpovědět | Admin
Zdravim vsechny mam takovy zacatecnicky problem, kdy nevim jak prinutit aby mi po secteni dvou cisel vytiskl danou promennou vysledek, takhle mi to vytiskne nic. diky za pomoc, jeslti nekdo vi jak.
SECTION .data
cislo1 dd 8
cislo2 dd 2
vysledek dd 0


SECTION .text
global _start 
_start:

mov eax,[cislo1]
mov ebx,[cislo2]
add eax,ebx    ;sectu cisla
mov [vysledek],eax   ;ulozim do vysledku

mov eax,4  ;prvni parametr cislo systemoveh ovolani
mov ebx,1  ;vim, ze konstanta stdout ma hodnotu 1
mov ecx,vysledek
mov edx,32 ;pocet znaku
int 0x80   ;zavolame jadro

mov eax,1  ;cislo volani jadra - exit
mov ebx,0  ;navratovy kod 0
int 0x80   ;zavolame jadro
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

15.1.2006 08:00 Michal Pokorný | skóre: 6
Rozbalit Rozbalit vše Re: assembler secteni cisla
Odpovědět | | Sbalit | Link | Blokovat | Admin
No já taky nejsem nějak extra dobrej programátor, ale řekl bych, že tu chybý konverze z datovédo typu dd (4-bytové celé číslo) na řetězec ;)
15.1.2006 10:14 Jirka | skóre: 36
Rozbalit Rozbalit vše Re: assembler secteni cisla
Odpovědět | | Sbalit | Link | Blokovat | Admin
Tato funkce by mela vypsat obsah registru AL, ale je to delane pomoci sluzeb DOSu. Doufam, ze se nikdo nebude zlobit, ze jsem to tu dal: ps: jen pro uplnost: int 21h zpusobi preruseni, tim se (podle obsahu registru - z hlavy to neznam) zavola pozadovana sluzba. A u techto funkci staci do AX zapsat byte. Vim, ze to je pro 16 bitovy rezim, ale pro 32 bitu by nemelo byt tezke to prepsat. Doufam ze jsem na nic nezapomnel. Vytahl jsem to z jedne knihovny, kterou mam k dispozici.

segment code

Write_Word:             ; AX=Byte
	pushf
    	pusha
    	mov si,4
    	mov bx,10
wwcyc1: mov dx,0
        div bx
    	add dl,'0'
	mov [z_w+si],dl
        dec si
        cmp si,0
        jnz wwcyc1
        add al,'0'
	mov [z_w],al
    	mov dx,z_w
    	mov si,0
wwcyc2: cmp [z_w+si],byte '0'
    	jne wwcont
    	inc dx
    	inc si
    	cmp si,4
    	jne wwcyc2
wwcont: call Print_Str   ; viz. nize
	popa
	popf
	ret

Print_Str:              ; DX=String_offset, String='???....???','$'
        pushf
        pusha
        mov ah,9
        int 21h         ;volani sluzeb DOSu
        popa
        popf
        ret

        segment data
z_w     resb 2

Jardík avatar 15.1.2006 11:37 Jardík | skóre: 40 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: assembler secteni cisla
Odpovědět | | Sbalit | Link | Blokovat | Admin
Opravdu tam chybí převod čísla na řetězec. Funkce na převod:
;--------------
;NumToAscii
;--------------
; eax = 32b číslo
; ebx = základ soustavy
; edi = pointer na buffer, kam bude uložen text
;--------------

NumToAscii:
pushad
xor esi,esi
.smycka_prevodu:
xor edx,edx
div ebx
call HexDigit
push edx
inc esi
test eax,eax
jnz .smycka_prevodu
cld
.smycka_zapis:
pop eax
stosb
dec esi
test esi,esi
jnz .smycka_zapis
popad
ret
HexDigit:
cmp dl,10
jb .mensi
add dl,'A'-10
ret
.mensi:
or dl,'0'
ret
Použití:
mov eax,[vysledek]
mov edi,buffer
call preved

v sekci .DATA
buffer:
TIMES 12 DB 0
Délku můžeš zjistit pomocí strlen:
strlen:
push eax
xor ecx,ecx
xor eax,eax
dec ecx
cld
repne scasb
neg ecx
pop eax
ret
Řetězec musí být uložen v ES:EDI a délka se vrátí v ecx. Jinak, abyste neřekli, že jsem blázen, tak prozradím, že je to z knihy Učíme se programovat v jazyce assembler pro PC
Věřím v jednoho Boha.
18.1.2006 11:40 _change
Rozbalit Rozbalit vše Re: assembler secteni cisla
diky, ale bohuzel zkousel jsem to nejak dat dohromady, a porad mi to nejde, nevim jak ten program dat dohromady, aby to fungovalo,nevite nekdo pls?
18.1.2006 12:46 Petr Šobáň | skóre: 80 | blog: soban | Olomouc
Rozbalit Rozbalit vše Re: assembler secteni cisla
A proč to píšeš v asm napiš to normálně v C a je po ptákách.
Jardík avatar 24.2.2006 22:37 Jardík | skóre: 40 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: assembler secteni cisla
Zde je funkční řešení tvého problému:
; překlad:
; nasm -f elf preved.asm
; ld -s -o preved preved.o

SECTION .text
global _start

_start:



; Sečtu Cislo1+Cislo2, výsledek do Vysledek
mov eax,[Cislo1]
mov ebx,[Cislo2]
add eax,ebx
mov [Vysledek],eax

; Převedu Vysledek na text do VysledekText
mov eax,[Vysledek]
mov ebx,10
mov edi,VysledekText
call NumToAscii

; Vytisknu vysledek

mov ebx,VysledekText	   ; ukazatel na text do ebx
mov esi,ebx            ; uložím ho ještě do esi
xor edx,edx

.next:
inc edx                ;v edx počítáme počet znaků, co budeme tisknout
lodsb                  ;načteme znak do al a k esi přičteme 1
or al,al               ;jsme už na konci řetězce (al==0)
jnz .next              ;ne? přičteme další znak
mov byte [esi-1],0xa   ;zapíšeme místo nulového byte na konci řetězce znak nového řádku


mov eax,4              ;systémové volání write( ebx = KAM, ecx = CO, edx = KOLIK )
mov ecx, ebx           ;v ebx byla adresa řetězce
mov ebx,1              ;STDOUT
                       ;v edx již je počet znaků
int 0x80               ;přerušení



; konec programu
mov eax, 1
mov ebx, 0
int 0x80


;--------------
;NumToAscii
;--------------
; eax = 32b číslo
; ebx = základ soustavy
; edi = pointer na buffer, kam bude uložen text
;--------------

NumToAscii:
pushad
xor esi,esi
.smycka_prevodu:
xor edx,edx
div ebx
call HexDigit
push edx
inc esi
test eax,eax
jnz .smycka_prevodu
cld
.smycka_zapis:
pop eax
stosb
dec esi
test esi,esi
jnz .smycka_zapis
popad
ret
HexDigit:
cmp dl,10
jb .mensi
add dl,'A'-10
ret
.mensi:
or dl,'0'
ret



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; DATA

SECTION .data

VysledekText TIMES 20 db 0
Cislo1 dd 8
Cislo2 dd 2
Vysledek dd 0
Věřím v jednoho Boha.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.