Portál AbcLinuxu, 10. května 2025 03:24
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
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
;-------------- ;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' retPoužití:
mov eax,[vysledek] mov edi,buffer call preved v sekci .DATA buffer: TIMES 12 DB 0Dé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
; 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
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.