User Tools

Site Tools


isu:cv03

[ISU] 3. Paměť, pole

cv3_0.asm ukázka

cv3_0.asm
; UKÁZKA
; Do x ulož hodnotu 12 a vypočítej a+b+x
 
%include "rw32.inc"
 
section .data
    a dw 60
    b dd 70
 
section .bss
    x resd 1
 
section .text
main:
    mov [x], 12
    mov eax, 0
    mov ax, [a]
    add eax, [b]
    mov [x], eax
    call WriteUInt32
    call WriteNewLine
    ret

cv3_1.asm

cv3_1.asm
; Vypočíte obvod obdélníku s 8b a 16b hodnoty v paměti.
 
%include "rw32.inc"
 
section .data
    a ?? 300  ; definuj velikost
    b ?? 200  ; definuj velikost
 
section .text
main:
    ; zde prosím výpočet
 
    call WriteUInt32
    call WriteNewLine
    ret

cv3_1.asm jedno z mnoha řešení

cv3_1.asm jedno z mnoha řešení

cv3_1.asm
%include "rw32.inc"
 
section .data
    a dw 300  ; 16b
    b db 200  ; 8b
    ; naopak to nejde, protože hodnota 200 se nevejde do 1 byte
 
section .text
main:
    mov eax, 0  ; vynuluju registry
    mov edx, 0
    mov ax, [a] ; z paměti do správně velkého registru 16b
    add eax, eax ; a+a ; eax pro případ přetečení
    mov dl, [b]  ; do 8b registru
    add edx, edx ; b+b
    add eax, edx ; (a+a)+(b+b)
 
    call WriteUInt32
    call WriteNewLine
    ret


cv3_2.asm

cv3_2.asm
; Vypočítej obvod trojúhelníku.
; Postupně načti od uživatele všechny tři strany: 8-bit, 16-bit, 32-bit čísla.
; Omezení: Máš k dispozici pouze jediný registr EAX, využí neinicializované proměnné.
 
%include "rw32.inc"
 
section .bss
    ; něco zde
 
section .text
main:
    ; tvůj kód zde
 
    call WriteUInt32
    call WriteNewLine
    ret

cv3_2.asm jedno z mnoha řešení

cv3_2.asm jedno z mnoha řešení

cv3_2.asm
; musíš to vymyslet sám :)


cv3_3.asm ukázka

cv3_3.asm
; UKÁZKA
; Práce s polem
%include "rw32.inc"
 
section .data
    pA  db  5       ; char  A = 5; char *pA = &A;
    pB  dw  1000    ; short B = 5; char *pB = &B;
    pC  dd  200000  ; long  C = 5;
 
    arrA db 11, 22, 33, 44, 55          ; char  arrA[5] = {11,22,33,44,55}; pole bytů s 5 prvky 
    arrB dw 222, 444, 666, 888          ; short arrB[4]
    arrC dd 0x12345, 0xFAFA5, 6969, 911 ; long  arrC[4]
    stri db "aloha",0
 
section .text
main:
    mov eax, 0
    mov al, [arrA + 0]
    mov al, [arrA + 1]
    mov al, [arrA + 2]
    mov al, [arrA + 3]
    mov al, [arrA + 4]
    nop
    mov ax, [arrB + 0]
    mov ax, [arrB + 2]
    mov ax, [arrB + 2*2]   ; [identifikátor + prvek*velikost]
    mov ax, [arrB + 3*2]
    nop
    mov ax, [arrB + 8]  ; ?
    mov ax, [arrB + 10]  ; ??
    mov ax, [arrB + 12]  ; ???
 
    ret

cv3_4.asm

cv3_4.asm
; Vypočítej hodnotu z prvků v polích
%include "rw32.inc"
 
section .data
    arrB db 9, 4, 1010b, 125, 17
    arrD dd 1234, 0x202, 6969, 911
    strFinal db "Done",0
 
section .text
main:
    mov eax, 0
    ; EAX = arrD[3] + arrB[2] - arrD[1] + arrB[4]
 
 
    ; tyto řádky nemodifikuj
    call WriteUInt32
    call WriteNewLine
    mov esi, strFinal
    call WriteString
    call WriteNewLine
    ret

cv3_4.asm jedno z mnoha řešení

cv3_4.asm jedno z mnoha řešení

cv3_4.asm
; Vypočítej hodnotu z prvků v polích
%include "rw32.inc"
 
section .data
    arrB db 9, 4, 1010b, 125, 17
    arrD dd 1234, 0x202, 6969, 911
    strFinal db "Done",0
 
section .text
main:
    mov eax, 0
    ; EAX = arrD[3] + arrB[2] - arrD[1] + arrB[4]
    mov eax, [arrD + 3*4]
    add al, [arrB + 2*1]
    sub eax, [arrD + 1*4]
    add al, [arrB + 4*1]
 
    call WriteUInt32
    call WriteNewLine
    mov esi, strFinal
    call WriteString
    call WriteNewLine
    ret


cv3_5.asm

cv3_5.asm
; Vytvoř neinicializované pole a od uživatele do něj načti 5 znaků.
; Předpokládáme, že uživatel skutečně zadá 5 znaků.
; Znaky přeskládej do opačného pořadí a vypiš na výstup.
; Např.:  ABCDE -> EDCBA
%include "rw32.inc"
 
section .bss
    ; něco zde
 
section .text
main:
    mov eax, 0
    ; tvůj kód zde
 
    ret

cv3_5.asm jedno z mnoha řešení

cv3_5.asm jedno z mnoha řešení

cv3_5.asm
%include "rw32.inc"
 
section .bss
    vstup resb 6   ; 5 znaků + ukončovací 0
 
section .text
main:
    mov eax, 0
    mov ebx, 5      ; požaduji 5 znaků od uživatele
    mov edi, vstup  ; ukládat se bude do rezervovaného místa
    call ReadStringNewLine
 
    ; prohození prvního a posledního znaku
    mov al, [vstup + 0]
    mov ah, [vstup + 4]
    mov [vstup + 0], ah
    mov [vstup + 4], al
 
    ; prohození druhého a předposledního znaku
    mov al, [vstup + 1]
    mov ah, [vstup + 3]
    mov [vstup + 1], ah
    mov [vstup + 3], al
 
    mov esi, vstup    ; do Source Index předej ukazatel
    call WriteString
    ret

isu/cv03.txt · Last modified: 2024/02/22 19:41 by sakin