Portál AbcLinuxu, 2. listopadu 2025 22:39
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.