Co robim pri tychto ulohach zle ze mi vychadzaju zle vysledky?
Vysledky su 1. c, 2. 2050, 3. 0, 4. 35h
1. Je deklarovaná premenná R DB ´abcd´. Čo vypíše nasledujúca postupnosť inštrukcií?
mov di, 1; ulozim do registra di 1
mov dl, [R+di]; ulozim do dl b
dec di; znizim di o 1 cize v nom bude 0
inc dl; zvysim dl o 1 potom tam bude c?
mov ah, 2; ulozim do ah 2 naco ho tam ukladam?
int 21h; tento prikaz spravi co? Meni vysledok?
2. Aké číslo (v desiatkovej sústave) bude v registri AX po vykonaní nasledujúcej postupnosti inštrukcií?
mov ah, 2; ulozim do ah 2
mov bh, 3; ulozim do bh 3
add ah, bh; pripocitam k 2 cislo 3 co je 5
add ah, bh; pripocitam k 5 cislo 3 co je 8
mov al, 2; ulozim do al cislo 2
Spocitam ah+al a vyjde 82 a nie 2050 preco?
3. Sú deklarované premenné:
DATA
Data1 DB 0
Data2 DB 2
Data3 DB 4
Čo bude v BX po vykonaní nasledujúcich inštrukcií?
mov al, 2; ulozim do al 2
mov bx, offset Data1; ulozim do bx 0
mov [bx], al; ulozim do adresy bx 2 a vyjde mi 2 no ma vyjst 0
4. Predpokladajte, že pamäťové miesta 200h a 201h obsahujú čísla 12h a 34h. (Uvedené adresy chápte ako offset v dátovom segmente.) Čo bude v registri AH po vykonaní nasledujúcich inštrukcií?
mov bx, 200h; ulozim do bx 200
mov di, 1; ulozim do di 1
mov ax, 10Ah; ulozim do ax 10A to rozdelim na ah=1 a al=0A
add ah, [bx+di]; pripocitam k 1 cislo 201 cize 202 co je zle a ma vyjst 35
Assembler otázky
Re: Assembler otázky
dec di už v tomto prípade nemá na výsledok žiaden vplyv, len ti má zamotať hlavu. V skutočnosti inc dl zvýši hodnotu dl z 0x42 ('b') na 0x43 ('c'). int 0x21 je prerušenie na komunikáciu s DOS-om, v tomto prípade je to funkcia 0x02, čiže vypísanie jedného znaku uloženého v dl na výstup.F1L1P napísal:Co robim pri tychto ulohach zle ze mi vychadzaju zle vysledky?
Vysledky su 1. c, 2. 2050, 3. 0, 4. 35h
1. Je deklarovaná premenná R DB ´abcd´. Čo vypíše nasledujúca postupnosť inštrukcií?
mov di, 1; ulozim do registra di 1
mov dl, [R+di]; ulozim do dl b
dec di; znizim di o 1 cize v nom bude 0
inc dl; zvysim dl o 1 potom tam bude c?
mov ah, 2; ulozim do ah 2 naco ho tam ukladam?
int 21h; tento prikaz spravi co? Meni vysledok?
Ty nespočítavaš al a ah, pretože ax nie je register obsahujúci ich súčet, ale 16-bitovú hodnotu skombinovanú z týchto dvoch. Teda ozajstným vzorcom je ax = (ah*256)+al.2. Aké číslo (v desiatkovej sústave) bude v registri AX po vykonaní nasledujúcej postupnosti inštrukcií?
mov ah, 2; ulozim do ah 2
mov bh, 3; ulozim do bh 3
add ah, bh; pripocitam k 2 cislo 3 co je 5
add ah, bh; pripocitam k 5 cislo 3 co je 8
mov al, 2; ulozim do al cislo 2
Spocitam ah+al a vyjde 82 a nie 2050 preco?
Do bx nevložíš nulu, ale odsadenie nulového bajtu Data1 od aktuálneho segmentu, čo vyzerá byť v tomto prípade 0. Tým že na adresu na ktorú ukazuje bx vložíš 2 zmeníš síce ten bajt, no samotné bx nie, preto 0.3. Sú deklarované premenné:
DATA
Data1 DB 0
Data2 DB 2
Data3 DB 4
Čo bude v BX po vykonaní nasledujúcich inštrukcií?
mov al, 2; ulozim do al 2
mov bx, offset Data1; ulozim do bx 0
mov [bx], al; ulozim do adresy bx 2 a vyjde mi 2 no ma vyjst 0
V poslednom kroku pripočítaš k ah to, čo je na adrese 201, teda 0x34. A 0x34+1 = 0x35.4. Predpokladajte, že pamäťové miesta 200h a 201h obsahujú čísla 12h a 34h. (Uvedené adresy chápte ako offset v dátovom segmente.) Čo bude v registri AH po vykonaní nasledujúcich inštrukcií?
mov bx, 200h; ulozim do bx 200
mov di, 1; ulozim do di 1
mov ax, 10Ah; ulozim do ax 10A to rozdelim na ah=1 a al=0A
add ah, [bx+di]; pripocitam k 1 cislo 201 cize 202 co je zle a ma vyjst 35
Re: Assembler otázky
Dakujem a co s takymi prikladmi
Spravna odpoved je 1
Su deklarovane premenne
.DATA
Data1 DB 2
Data2 DB 4
Data3 DB 6
Co bude v BX po vykonani nasledujucich instrukcii?
mov bx,offset Data2; ulozim do bx 4. bajt
inc byte ptr [bx]; ptr meni typ premennej ale tu nema co zmenit cize zvysim len na 5. adresu a preco vyjde 1?
A pri tejto ulohe ma vyjst cd
Je deklarovana premenna
R DB "abcd$"; co znamena ten $?
Co vypise nasledujuca postupnost instrukcii?
mov dx, offset R+2; ulozim do dx c
mov ah,9; ulozim do ah 9
int 21h
Spravna odpoved je 1
Su deklarovane premenne
.DATA
Data1 DB 2
Data2 DB 4
Data3 DB 6
Co bude v BX po vykonani nasledujucich instrukcii?
mov bx,offset Data2; ulozim do bx 4. bajt
inc byte ptr [bx]; ptr meni typ premennej ale tu nema co zmenit cize zvysim len na 5. adresu a preco vyjde 1?
A pri tejto ulohe ma vyjst cd
Je deklarovana premenna
R DB "abcd$"; co znamena ten $?
Co vypise nasledujuca postupnost instrukcii?
mov dx, offset R+2; ulozim do dx c
mov ah,9; ulozim do ah 9
int 21h
Re: Assembler otázky
Kód: Vybrať všetko
.DATA
Data1 DB 2
Data2 DB 4
Data3 DB 6
; co bude v BX po vykonani nasledujucich instrukcii?
mov bx,offset Data2; ulozim do bx 4. bajt
inc byte ptr [bx]; ptr meni typ premennej ale tu nema co zmenit cize zvysim len na 5. adresu a preco vyjde 1?
- kedže neexistuje typ a všetko je hodnota, nezáleží na tom čo je "ako aký typ" uložené, ale ako sa s tým pracuje
- z [1.] vyplýva, že to čo sa urobí s akýmkoľvek hodnotou či už v registri alebo pamäti nezávisí od toho, čo o nej povieš pri deklarácii, ale od toho čo s ňou budeš robiť v inštrukcii.
Kód: Vybrať všetko
.DATA
Kód: Vybrať všetko
Data1 DB 2 ; (offset Data1) = 0x00
Data2 DB 4 ; (offset Data2) = 0x01
Data3 DB 6 ; (offset Data3) = 0x02
Kód: Vybrať všetko
mov bx, offset Data2
- ak je Data1 prvý bajt v poradí, tak jeho odsadenie bude 0 (pretože od segmentu je vzdialený na 0 bajtov ďaleko)
- ak je Data2 druhý bajt v poradí, tak jeho odsadenie bude 1 (pretože od segmentu je vzdialený na 1 bajt -> Data1)
- ak je Data3 tretí bajt v poradí, tak jeho odsadenie bude 2 (pretože od segmentu je vzdialený na 2 bajt -> Data1 a Data2)
Kód: Vybrať všetko
inc byte ptr [bx]; ptr meni typ premennej ale tu nema co zmenit cize zvysim len na 5. adresu a preco vyjde 1?
Nijakým zvláštnym spôsobom sa neviaž na ptr, pretože oveľa častejšie (teda... eh... všade okrem MS assemblerov a produktov) sa stretneš iba s informáciou o veľkosti bajtu a zátvorkami (hranatými, okrúhlymi).
//autoeditácia príspevku (24 Nov 2014, 20:14)
Kód: Vybrať všetko
R DB "abcd$"; co znamena ten $?Kód: Vybrať všetko
mov dx, offset R+2Kód: Vybrať všetko
R_1 db 'a' ; offset neznámy
R_2 db 'b' ; (offset R_1)+1
R_3 db 'c' ; (offset R_1)+2
R_4 db 'd' ; (offset R_1)+3
R_5 db '$' ; (offset R_1)+4
Takže, do dx ide jednoducho adresa (offset R)+2, teda adresa céčka.
Kód: Vybrať všetko
mov ah,9
int 21hRe: Assembler otázky
Kebyze zmenim DB za DW tak to bude stupat o 2 bajty a bude to vyzerat takto?pcsiete napísal: offset je odsadenie, a kedže každá z položiek ktorú sme deklarovali má veľkosť presne jeden bajt, odsadenie od začiatku segmentu stúpa po každom bajte o neuveriteľný jeden bajt.
Data1 DW 2 ; (offset Data1) = 0x00
Data2 DW 4 ; (offset Data2) = 0x02
Data3 DW 6 ; (offset Data3) = 0x04
Re: Assembler otázky
Áno.
Presnejšie povedané, odsadenie bude stúpať o 2, kým segment sa bude zväčšovať o 2 bajty.... tak to bude stupat o 2 bajty ...