Pereiti prie turinio

Rekomenduojami pranešimai

Sveiki.

 

Reikia pagalbos rašant assemblerio programos kodą. Esu visiškai žalias šioje srityje, tai nepykit, jei mano klausimas jums pasirodys kvailas.

 

Užduotis prašo į ekraną išvesti trumpiausio žodžio sakinyje ilgį. Pasiskaitęs konspektus, per visą dieną sugebėjau parašyti tik pačią pradžią - eilutės nuskaitymą. Nesugalvoju ką rašyti toliau. Būtų gerai, kad netik parašytumėt kodą, bet ir paaiškintumėt, arba bent užvestumėt mane ant kelio, nes vistiek visą programą turėsiu paaiškinti dėstytojui. :D

 

Dėkui. :)

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Sveiki.

 

Reikia pagalbos rašant assemblerio programos kodą. Esu visiškai žalias šioje srityje, tai nepykit, jei mano klausimas jums pasirodys kvailas.

 

Užduotis prašo į ekraną išvesti trumpiausio žodžio sakinyje ilgį. Pasiskaitęs konspektus, per visą dieną sugebėjau parašyti tik pačią pradžią - eilutės nuskaitymą. Nesugalvoju ką rašyti toliau. Būtų gerai, kad netik parašytumėt kodą, bet ir paaiškintumėt, arba bent užvestumėt mane ant kelio, nes vistiek visą programą turėsiu paaiškinti dėstytojui. :D

 

Dėkui. :)

 

 

%title "Trumpiausio zodzio ilgis"
.model small
.stack 100h
.data
atsakymas db 0Dh,0Ah,'Trumpiausio zodzio eiluteje ilgis: ','$'
eilute dw 255
.code
pradzia:
mov ax, @data
mov ds, ax

mov ah, 0Ah
mov dx, offset eilute
int 21h

mov bh,00
mov bl, byte ptr [eilute + 1]
mov byte ptr [eilute + bx + 2], ' '
mov byte ptr [eilute + bx + 3], '$'

mov di, 2
mov si, 0
mov bx, 00ffh

.tikrink:
cmp byte ptr [eilute + di], '$'
	je .pabaiga
cmp byte ptr [eilute + di], ' '
	je .tarpas
inc di
inc si
jmp .tikrink

.tarpas:
cmp bx, si
	ja .didesnis
inc di
mov si, 0
jmp .tikrink
.didesnis:
mov bx, si
inc di
mov si, 0
jmp .tikrink

.pabaiga:
mov ah, 09h
mov dx, offset atsakymas
int 21h

add bl, '0'

mov al, bl
int 29h

mov ah, 4Ch
int 21h
end pradzia

 

Programa išves gerą atsakymą jeigu mažiausias žodis bus iki 9 simbolių. Čia kaipo viskas elementaru tai nepyk, bet tingiu aiškint. :D

Nuoroda į pranešimą
Dalintis kituose puslapiuose

%title "Trumpiausio zodzio ilgis"
.model small
.stack 100h
.data
atsakymas db 0Dh,0Ah,'Trumpiausio zodzio eiluteje ilgis: ','$'
eilute dw 255
.code
pradzia:
mov ax, @data
mov ds, ax

mov ah, 0Ah
mov dx, offset eilute
int 21h

mov bh,00
mov bl, byte ptr [eilute + 1]
mov byte ptr [eilute + bx + 2], ' '
mov byte ptr [eilute + bx + 3], '$'

mov di, 2
mov si, 0
mov bx, 00ffh

.tikrink:
cmp byte ptr [eilute + di], '$'
	je .pabaiga
cmp byte ptr [eilute + di], ' '
	je .tarpas
inc di
inc si
jmp .tikrink

.tarpas:
cmp bx, si
	ja .didesnis
inc di
mov si, 0
jmp .tikrink
.didesnis:
mov bx, si
inc di
mov si, 0
jmp .tikrink

.pabaiga:
mov ah, 09h
mov dx, offset atsakymas
int 21h

add bl, '0'

mov al, bl
int 29h

mov ah, 4Ch
int 21h
end pradzia

 

Programa išves gerą atsakymą jeigu mažiausias žodis bus iki 9 simbolių. Čia kaipo viskas elementaru tai nepyk, bet tingiu aiškint. :D

 

Na ačiū ir už tiek. :D Bet man neišveda teisingo atsakymo. Pavyzdžiui parašius "labas vakaras" turėtų išvesti 5. 54 eilutėje meta "this interrupt is not defined yet".

Redagavo yellowcard
Nuoroda į pranešimą
Dalintis kituose puslapiuose

emu8086

 

Gali gal kokį link numesti, iš ko mokytis, nes pusės kas čia parašyta nesuprantu? :D Arba kokius nors, kad ir minimalius komentarus parašyk. :)

 

 

Dėl veikimo programos tai EMU neturi 29h interrupto, todėl eilutę

mov al, bl
int 29h

pakeisk į

mov ah, 02h
mov dl, bl
int 21h

 

%title "Trumpiausio zodzio ilgis"
.model small
.stack 100h
.data
atsakymas db 0Dh,0Ah,'Trumpiausio zodzio eiluteje ilgis: ','$'
eilute dw 255
.code
pradzia:
mov ax, @data								; init .data seg
mov ds, ax									;

mov ah, 0Ah									; isvedimo funkc.
mov dx, offset eilute
int 21h

mov bh,00 								
mov bl, byte ptr [eilute + 1]				; po 0Ah funkcijos, pirmi du baitai rodo įvestos eilutės ilgį, tas ilgis išsaugomas
mov byte ptr [eilute + bx + 2], ' '			; eilutės gale tarpas (kitaip netikrintų paskutinio žodžio) 
mov byte ptr [eilute + bx + 3], '$'			; žymi eilutės pabaigą

mov di, 2 									; di, si - iteruojami registrai
mov si, 0 									;
mov bx, 00ffh 								; bet kokia reiškmė didesnė už 10, skirta tikrinimui su žodžio ilgiu

.tikrink:
cmp byte ptr [eilute + di], '$'				; tikrina ar eilutės pabaiga, jei pabaiga šoka į ".pabaiga:"
	je .pabaiga
cmp byte ptr [eilute + di], ' '				; tikrina ar tarpas 
	je .tarpas
inc di
inc si
jmp .tikrink								; nepraėjus tikrinimų šoka atgal į pradžią su padidintais di, si

.tarpas:
cmp bx, si 									; jei žodžio ilgis mažesnis už buvusį žodžio ilgį (bx) ir jį priskiria. jei ne tikrina toliau
	ja .didesnis
inc di
mov si, 0
jmp .tikrink
.didesnis:
mov bx, si
inc di
mov si, 0
jmp .tikrink

.pabaiga:
mov ah, 09h									; išveda funkc.
mov dx, offset atsakymas
int 21h

add bl, '0'									; hex2dec

mov ah, 02h									; išveda mažiausią ilgį
mov dl, bl
int 21h

mov ah, 4Ch
int 21h
end pradzia

 

dėl mokymosi, tai galiu pasiųlyt tik intelio dokumentaciją.

kur jus čia kankina su tuo emu?

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Dėl veikimo programos tai EMU neturi 29h interrupto, todėl eilutę

mov al, bl
int 29h

pakeisk į

mov ah, 02h
mov dl, bl
int 21h

 

%title "Trumpiausio zodzio ilgis"
.model small
.stack 100h
.data
atsakymas db 0Dh,0Ah,'Trumpiausio zodzio eiluteje ilgis: ','$'
eilute dw 255
.code
pradzia:
mov ax, @data								; init .data seg
mov ds, ax									;

mov ah, 0Ah									; isvedimo funkc.
mov dx, offset eilute
int 21h

mov bh,00 								
mov bl, byte ptr [eilute + 1]				; po 0Ah funkcijos, pirmi du baitai rodo įvestos eilutės ilgį, tas ilgis išsaugomas
mov byte ptr [eilute + bx + 2], ' '			; eilutės gale tarpas (kitaip netikrintų paskutinio žodžio) 
mov byte ptr [eilute + bx + 3], '$'			; žymi eilutės pabaigą

mov di, 2 									; di, si - iteruojami registrai
mov si, 0 									;
mov bx, 00ffh 								; bet kokia reiškmė didesnė už 10, skirta tikrinimui su žodžio ilgiu

.tikrink:
cmp byte ptr [eilute + di], '$'				; tikrina ar eilutės pabaiga, jei pabaiga šoka į ".pabaiga:"
	je .pabaiga
cmp byte ptr [eilute + di], ' '				; tikrina ar tarpas 
	je .tarpas
inc di
inc si
jmp .tikrink								; nepraėjus tikrinimų šoka atgal į pradžią su padidintais di, si

.tarpas:
cmp bx, si 									; jei žodžio ilgis mažesnis už buvusį žodžio ilgį (bx) ir jį priskiria. jei ne tikrina toliau
	ja .didesnis
inc di
mov si, 0
jmp .tikrink
.didesnis:
mov bx, si
inc di
mov si, 0
jmp .tikrink

.pabaiga:
mov ah, 09h									; išveda funkc.
mov dx, offset atsakymas
int 21h

add bl, '0'									; hex2dec

mov ah, 02h									; išveda mažiausią ilgį
mov dl, bl
int 21h

mov ah, 4Ch
int 21h
end pradzia

 

dėl mokymosi, tai galiu pasiųlyt tik intelio dokumentaciją.

kur jus čia kankina su tuo emu?

Nekankina, tiesiog patarė šitą naudot arba DosBox'ą.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

  • Prisijunk prie bendruomenės dabar!

    Uždarbis.lt nariai domisi verslo, IT ir asmeninio tobulėjimo temomis, kartu sprendžia problemas, dalinasi žiniomis ir idėjomis, sutinka būsimus verslo partnerius ir dalyvauja gyvuose susitikimuose.

    Užsiregistruok dabar ir galėsi:

    ✔️ Dalyvauti diskusijose;

    ✔️ Kurti naujas temas;

    ✔️ Rašyti atsakymus;

    ✔️ Vertinti kitų žmonių pranešimus;

    ✔️ Susisiekti su bet kuriuo nariu asmeniškai;

    ✔️ Naudotis tamsia dizaino versija;

    ir dar daugiau.

    Registracija trunka ~30 sek. ir yra visiškai nemokama.

  • Naujausios temos

  • Karštos temos

×
×
  • Pasirinkite naujai kuriamo turinio tipą...