TASM na NASM

Programovacie jazyky, rady, poradňa...
djkmito
Amateur
Amateur
Používateľov profilový obrázok
Príspevky: 25
Registrovaný: 05 dec 2005, 18:12

TASM na NASM

Príspevok od používateľa djkmito »

zdravim.. vedel by niekto prerobit tento program pre TASM na NASM?
dakujem

Kód: Vybrať všetko

.model	small
.stack	10
.code
BEGIN:	xor cx,cx
	xor bx,bx
	xor dx,dx	; vymazanie registrov bx, cx a dx

READ:	mov ah,01h
	int 21h		; funkcia DOSu - citanie z klavesnice
	cmp al,0dh
	jz ENT		; skok, ak bol stlaceny Enter
	cmp al,20h
	jz SPACE	; skok, ak bol stlaceny Medzernik
	mov dx,01h
	and al,01h
	cmp al,01h	; bol stlaceny znak s neparnym ASCII kodom ?
	jz READ		; ak ano, skok na READ
	jmp INCBX	; a ak nie, skok na INCBX

INCBX:	inc bx		; bx = bx + 1 (inkrementuje register bx o 1) 
	jmp READ	; a skok na READ

ENT:	cmp dx,00h	; porovnava register dx s nulou
	jz VYPIS	; ak dx=0, tak skok na VYPIS
	cmp bx,00h	; a ak nie, tak porovnava reg. bx s nulou
	jz INCCX1	; ak bx=0, tak skok na INCCX1
	jmp VYPIS	; a ak nie tak skok na VYPIS

SPACE:	cmp dx,00h	; porovnava register dx s nulou
	jz NULDX	; ak dx=0, tak skok na NULDX
	cmp bx,00h	; a ak nie, tak porovnava reg. bx s nulou
	jz INCCX2	; ak bx=0, tak skok na INCCX2
	jmp NULBX	; a ak nie tak skok na NULBX

INCCX1:	inc cx		; inkrementacia pocitadla
	jmp VYPIS	; a skok na VYPIS

INCCX2:	inc cx		; inkrementacia pocitadla
	jmp NULDX	; a skok na READ

NULDX:	xor dx,dx	; vynulovanie registra dx
	jmp READ	; a skok na READ

NULBX:	xor bx,bx	; vynulovanie registra bx
	jmp NULDX	; a skok na NULDX

VYPIS:	mov dl,0ah	; do registra dl vlozi ASCII hodnotu klavesy ENTER
	mov ah,02h
	int 21h		; funkcia DOSu - skok na novy riadok
	mov bx,cx	; do registra bx ulozi hodnotu registra cx
	push bx		; ulozenie obsahu registra bx do zasobnika
	and bh,80h
	cmp bh,00h	; test ci prvy bit je 0 alebo 1
	jz WRT0		; ak je 0, tak skok na WRT0
	jmp WRT1	; ak je 1, tak skok na WRT1

WRT0:	mov dl,00h	; do registra dl ulozi 0
	add dl,30h
	mov ah,02h
	int 21h		; a vypise ju na obrazovku
	jmp WRITE	; potom skok na WRITE

WRT1:	mov dl,01h
	add dl,30h
	mov ah,02h
	int 21h		; a vypise ju na obrazovku
	jmp WRITE	; potom skok na WRITE

WRITE:	pop bx		; vratenie povodnej hodnoty registra bx zo zasobnika
	rol bx,01h	; rotacia registra bx o 1 bit vlavo
	mov cx,05h	; do registra cx sa ulozi 5, lebo potrebujem vypisat este 5 cislic
OPAKUJ:	push cx		; ulozenie obsahu registra cx do zasobnika
	mov cl,03h	; do registra cl sa ulozi 3, lebo robim posun o 3 bity
	rol bx,cl	; posun registra bx o 3 bity vlavo
	mov dx,bx	; do registra dx ulozi hodnotu registra bx
	and dx,07h	; potrebujeme zobrazit len posledne 3 bity z obsahu registra
	add dl,30h	; posun v ASCII tabulke na znak '0'
	mov ah,02h
	int 21h		; funkcia DOSu - vypis na obrazovku
	pop cx		; vratenie povodnej hodnoty registra cx zo zasobnika
	loop OPAKUJ	; cyklus kym cx!=0
	mov ax,4c00h
	int 21h		; ukoncenie programu
END	BEGIN
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Re: TASM na NASM

Príspevok od používateľa chrono »

Na začiatku vymaž

Kód: Vybrať všetko

.model   small
.stack   10
.code
a daj tam

Kód: Vybrať všetko

org 100h
section .text
a na konci vymaž

Kód: Vybrať všetko

END   BEGIN
(teda ak ti stačí program v tvare .com; ak chceš generovať exe súbor, musí sa to upraviť mierne inak, ale tam záleží aj na tam, aký linker používaš)
djkmito
Amateur
Amateur
Používateľov profilový obrázok
Príspevky: 25
Registrovaný: 05 dec 2005, 18:12

Re: TASM na NASM

Príspevok od používateľa djkmito »

no hej.. to je ten problem ze potrebujem aj exe a moc tomu nerozumiem.. bol by som velmi vdacny tomu kto by sa s tym trochu pohral aby to slo aj pre NASM

prikladam aj linker a este nejake subory ktore su mozno potrebne.. neviem.. kompiluje sa to cez GCC
Prílohy
asm.zip
(10.5 KiB) 15 stiahnutí
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Re: TASM na NASM

Príspevok od používateľa chrono »

Podľa toho čo si poslal to vyzerá tak, že máš vytvoriť 32 bitovú aplikáciu a teda to čo máš použiť nemôžeš (ale môžeš sa tým inšpirovať, len znaky budeš načítavať a vypisovať pomocou funkcií v súbore asm_io.asm)

//autoeditácia príspevku (16 Máj 2010, 15:55)
Inak vôbec netuším, čo má ten program vlastne robiť. Tie komentáre popisujú len to, čo je jasné priamo z inštrukcií, takže ani neviem odhadnúť čo to vlastne má robiť.

Čistá konverzia toho kódu vyzerá asi takto, ale nerobí to nič, pretože, ako som už písal, vôbec neviem, čo to má robiť (navyše veľa vecí sa tam dá urobiť oveľa zrozumiteľnejšie):

Kód: Vybrať všetko

%include "asm_io.inc"

segment .text

global asm_main

asm_main:
   enter 0,0
   pusha

   xor ecx,ecx
   xor ebx,ebx
   xor edx,edx   ; vymazanie registrov bx, cx a dx

READ:
   call read_char
   cmp al,0dh
   jz ENT      ; skok, ak bol stlaceny Enter
   cmp al,0ah
   jz ENT      ; skok, ak bol stlaceny Enter
   cmp al,20h
   jz SPACE   ; skok, ak bol stlaceny Medzernik
   mov edx,01h
   and al,01h
   cmp al,01h   ; bol stlaceny znak s neparnym ASCII kodom ?
   jz READ      ; ak ano, skok na READ
   jmp INCBX   ; a ak nie, skok na INCBX

INCBX:
   inc ebx      ; bx = bx + 1 (inkrementuje register bx o 1) 
   jmp READ   ; a skok na READ

ENT:
   cmp edx,00h   ; porovnava register dx s nulou
   jz VYPIS   ; ak dx=0, tak skok na VYPIS
   cmp ebx,00h   ; a ak nie, tak porovnava reg. bx s nulou
   jz INCCX1   ; ak bx=0, tak skok na INCCX1
   jmp VYPIS   ; a ak nie tak skok na VYPIS

SPACE:
   cmp edx,00h   ; porovnava register dx s nulou
   jz NULDX   ; ak dx=0, tak skok na NULDX
   cmp ebx,00h   ; a ak nie, tak porovnava reg. bx s nulou
   jz INCCX2   ; ak bx=0, tak skok na INCCX2
   jmp NULBX   ; a ak nie tak skok na NULBX

INCCX1:
   inc ecx      ; inkrementacia pocitadla
   jmp VYPIS   ; a skok na VYPIS

INCCX2:
   inc ecx      ; inkrementacia pocitadla
   jmp NULDX   ; a skok na READ

NULDX:
   xor edx,edx   ; vynulovanie registra dx
   jmp READ   ; a skok na READ

NULBX:
   xor ebx,ebx   ; vynulovanie registra bx
   jmp NULDX   ; a skok na NULDX

VYPIS:
   call print_nl
   mov ebx,ecx   ; do registra bx ulozi hodnotu registra cx
   push ebx      ; ulozenie obsahu registra bx do zasobnika
   and bh,80h
   cmp bh,00h   ; test ci prvy bit je 0 alebo 1
   jz WRT0      ; ak je 0, tak skok na WRT0
   jmp WRT1   ; ak je 1, tak skok na WRT1

WRT0:
   mov eax,00h   ; do registra dl ulozi 0
   add al,30h
   call print_char
   jmp WRITE   ; potom skok na WRITE

WRT1:
   mov eax,01h
   add al,30h
   call print_char
   jmp WRITE   ; potom skok na WRITE

WRITE:
   pop ebx      ; vratenie povodnej hodnoty registra bx zo zasobnika
   rol ebx,01h   ; rotacia registra bx o 1 bit vlavo
   mov ecx,05h   ; do registra cx sa ulozi 5, lebo potrebujem vypisat este 5 cislic
OPAKUJ:
   push ecx      ; ulozenie obsahu registra cx do zasobnika
   mov cl,03h   ; do registra cl sa ulozi 3, lebo robim posun o 3 bity
   rol ebx,cl   ; posun registra bx o 3 bity vlavo
   mov eax,ebx   ; do registra dx ulozi hodnotu registra bx
   and eax,07h   ; potrebujeme zobrazit len posledne 3 bity z obsahu registra
   add al,30h   ; posun v ASCII tabulke na znak '0'
   call print_char
   pop ecx      ; vratenie povodnej hodnoty registra cx zo zasobnika
   loop OPAKUJ   ; cyklus kym cx!=0

   popa
   leave
   ret
djkmito
Amateur
Amateur
Používateľov profilový obrázok
Príspevky: 25
Registrovaný: 05 dec 2005, 18:12

Re: TASM na NASM

Príspevok od používateľa djkmito »

vravim ze ja tomu velmi nerozumiem a malo by to robit to ze vypise pocet slov ktore obsahuju len znaky s neparnym ascii kodom takze je celkom mozne ze to vyzera ako keby to nic nerobilo.. a cize to co si sem hodil uz by malo ist skompilovat aj v nasm?
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Re: TASM na NASM

Príspevok od používateľa chrono »

Áno, skompilovať sa to dá. Inak celá tá časť s výpisom toho čísla bude call print_int (a pred tým sa do eax vloží to číslo, ktoré sa má vypísať).
djkmito
Amateur
Amateur
Používateľov profilový obrázok
Príspevky: 25
Registrovaný: 05 dec 2005, 18:12

Re: TASM na NASM

Príspevok od používateľa djkmito »

sry ze este furt otravujem, ale nemohol by si do toho dorobit este na zaciatok nejaky vtup pre zadavanie znakov z klavesnice a na koniec vypis? pokusal som sa to tam dorobit ale nejako to nefunguje :(
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Re: TASM na NASM

Príspevok od používateľa chrono »

"Nejako nefunguje" nie je popis problému (mne to totiž text načítava a aj na konci niečo vypíše, samozrejme nie to, čo chceš).

Toto je mierne upravená verzia a už čiastočne funguje, ale takmer všetko sa tam dá urobiť elegantnejšie a navyše to nezapočíta posledné slovo (ak zaň nedáš medzeru):

Kód: Vybrať všetko

%include "asm_io.inc"

segment .text

global asm_main

asm_main:
   enter 0,0
   pusha

   xor ecx,ecx
   xor ebx,ebx
   xor edx,edx   ; vymazanie registrov bx, cx a dx

READ:
   call read_char
   cmp al,0dh
   jz ENT      ; skok, ak bol stlaceny Enter
   cmp al,0ah
   jz ENT      ; skok, ak bol stlaceny Enter
   cmp al,20h
   jz SPACE   ; skok, ak bol stlaceny Medzernik
   mov edx,01h
   and al,01h
   cmp al,01h   ; bol stlaceny znak s neparnym ASCII kodom ?
   jz READ      ; ak ano, skok na READ
   jmp INCBX   ; a ak nie, skok na INCBX

INCBX:
   inc ebx      ; bx = bx + 1 (inkrementuje register bx o 1) 
   jmp READ   ; a skok na READ

ENT:
   cmp edx,00h   ; porovnava register dx s nulou
   jz VYPIS   ; ak dx=0, tak skok na VYPIS
   cmp ebx,00h   ; a ak nie, tak porovnava reg. bx s nulou
   jz INCCX1   ; ak bx=0, tak skok na INCCX1
   jmp VYPIS   ; a ak nie tak skok na VYPIS

SPACE:
   cmp edx,00h   ; porovnava register dx s nulou
   jz NULDX   ; ak dx=0, tak skok na NULDX
   cmp ebx,00h   ; a ak nie, tak porovnava reg. bx s nulou
   jnz INCCX2   ; ak bx=0, tak skok na INCCX2
   jmp NULBX   ; a ak nie tak skok na NULBX

INCCX1:
   inc ecx      ; inkrementacia pocitadla
   jmp VYPIS   ; a skok na VYPIS

INCCX2:
   inc ecx      ; inkrementacia pocitadla
   jmp NULDX   ; a skok na READ

NULDX:
   xor edx,edx   ; vynulovanie registra dx
   jmp READ   ; a skok na READ

NULBX:
   xor ebx,ebx   ; vynulovanie registra bx
   jmp NULDX   ; a skok na NULDX

VYPIS:
   mov eax, ecx
   call print_int

   popa
   leave
   ret
djkmito
Amateur
Amateur
Používateľov profilový obrázok
Príspevky: 25
Registrovaný: 05 dec 2005, 18:12

Re: TASM na NASM

Príspevok od používateľa djkmito »

hej no.. to sm si vsimol ze to posledne nezapocitava.. co uz no.. a sry to ja som sa zle vyjadril.. som mal namysli len to ze tam neviem pred ten vstup dan nieco take ako "Zadajte slovo:" a potom aby to aj vypisalo formou "Vyskyt slov s neparnym ASCII kodom je:"

tak uz som to tam hodil ten text.. uz len osetrit to posledne slovo
Napísať odpoveď