Assembler - problém s češtinou?

Elune

Assembler - problém s češtinou?
« kdy: 28. 05. 2014, 13:07:14 »
Ahoj,
naprogramoval jsem program v assembleru, který po zadání věty vypíše slova v opačném pořadí.
Např. "Ahoj jak se mas" >>> "mas se jak Ahoj"
Program pracuje na principu vyhledávání mezer. Při hledání mezery pracuji tedy s porovnáváním, jestli je znak menší než 32 v ASCI tabulce. Pracuje správně, dokud nejsou na vstupu znaky české abecedy (ěščřžýáíé).
Výstup v tomto případě vypadá např. takto "ě š čau ř" >>> "řauě š č"
Poradíte mi prosím, jak tento problém řešit? Nevím s rady.


Brad Nepitt

Re:Assembler - problém s češtinou?
« Odpověď #1 kdy: 28. 05. 2014, 13:26:48 »
Mam takove krute podezreni, ze americti imperialiste schvalne nepridali cestinu do ASCII. Sabotuji tve bohulibe usili, parchanti.

Kolemjdoucí

Re:Assembler - problém s češtinou?
« Odpověď #2 kdy: 28. 05. 2014, 13:36:42 »
Poradíte mi prosím, jak tento problém řešit?

Dostudovat si jak funguje instrukce CMP.

Následně nepoužít JL/JNL, ale JB/JNB.

JarinBarin

Re:Assembler - problém s češtinou?
« Odpověď #3 kdy: 28. 05. 2014, 14:04:14 »
Začal bych tím že si vypíšeš v hexa ten vstup, tak uvidíš jak jsou kódóvány ty české znaky a třeba přijdeš na to proč se to chová tak jak se to chová.

Sten

Re:Assembler - problém s češtinou?
« Odpověď #4 kdy: 28. 05. 2014, 15:05:12 »
Bez zdrojáku se těžko radí, ale tipuju, že tam máte znaménkové porovnání a ty české znaky mají zapnutý osmý bit, tedy vypadají jako záporné.


Re:Assembler - problém s češtinou?
« Odpověď #5 kdy: 28. 05. 2014, 15:07:42 »
Pracuje správně, dokud nejsou na vstupu znaky české abecedy
Na vstupu zcela jistě nejsou znaky, ale bajty. Pro převádění mezi znaky a bajty slouží různé znakové sady a kódování. Znaková sada přiděluje jednotlivým znakům čísla, kódování pak určuje, jak se tato čísla zapisují do sekvence bajtů.

Vy tedy potřebujete vědět, v jaké znakové sadě máte vstup, následně rozpoznat jednotlivé znaky (třeba v kódování UTF-8 může být jeden znak vyjádřen jako jeden až šest bajtů), rozpoznat slova a prohodit jejich pořadí. Když to děláte podle bajtů, klidně za mezeru můžete považovat bajt, který je součástí nějakého znaku – a to bajtové vyjádření znaku roztrhnete na dvě části a uděláte z toho třeba dva úplně jiné znaky.

Při hledání mezery pracuji tedy s porovnáváním, jestli je znak menší než 32 v ASCI tabulce.
Ta tabulka se jmenuje ASCII a je to jedna ze znakových sad. Původní znaková sada ASCII je jen sedmibitová a české znaky s diakritiky neobsahuje.

Mezera má v ASCII (a v mnoha dalších znakových sadách) hodnotu 32 (dekadicky), měl byste tedy porovnávat na přesnou shodu. Znaky 0–31 jsou různé kontrolní znaky, rozhodně ne mezery. Třeba ve znakové sadě Unicode existují i další znaky, než jenom obyčejná mezera – neoddělitelná mezera, zúžená mezera apod. Jako oddělovač slov dokonce nemusí fungovat jen mezera, ale třeba také tabulátor nebo konec řádku.

Jakub Galgonek

Re:Assembler - problém s češtinou?
« Odpověď #6 kdy: 28. 05. 2014, 16:16:26 »
třeba v kódování UTF-8 může být jeden znak vyjádřen jako jeden až šest bajtů

Pokud vím, maximum jsou čtyři bajty.


Když to děláte podle bajtů, klidně za mezeru můžete považovat bajt, který je součástí nějakého znaku – a to bajtové vyjádření znaku roztrhnete na dvě části a uděláte z toho třeba dva úplně jiné znaky.

Jen doplním, že v UTF-8 se tohle stát nemůže.

Michal Kovačič

Re:Assembler - problém s češtinou?
« Odpověď #7 kdy: 28. 05. 2014, 16:19:49 »
Pokud je to cvičení nebo snaha se naučit Assembler - smekám klobouk. Pokud je to součást reálného projektu - hmmm zrovna tady je assembler ne zcela optimální nástroj. Jinak předřečníci to vystihli zcela přesně.

Elune

Re:Assembler - problém s češtinou?
« Odpověď #8 kdy: 28. 05. 2014, 17:32:37 »
Jde o cvičení. Můj dosavadní kód vypadá následovně.

                        .h8300s
      
         .equ syscall,   0x1FF00            
         .equ GETC,      0x0111            
         .equ PUTC,       0x0112            
         .equ PUTS,       0x0114            
         .equ slm,       0x00FF            
         
         .data
string:      .space      slm                  
buffer_in:           .space      1                  
buffer_out:           .space      1                  
input:              .asciz              "Zadej vetu: "         
result:      .asciz              "Obracene: "         
newline:           .asciz              "\n"               

         .align              2                  
par1:              .long              buffer_in            
par2:              .long              buffer_out            
par3:              .long              input               
par4:              .long              result               
par_row:           .long              newline               

         .align             1                  
         .space      0x100               
stck:
         .text
         .global          _start
         
_start:      mov.l            #stck,ER7            

begin:      mov.w         #PUTS,R0            
         mov.l            #par_row,ER1         
         jsr           @syscall
         
         mov.w         #PUTS,R0            
         mov.l            #par3,ER1            
         jsr           @syscall

         jsr           @inp_str            
         
         mov.w        #PUTS,R0            
         mov.l           #par4,ER1            
         jsr          @syscall

cykl1:      cmp.l           #0, ER3               
         bne           cykl1_1               
         jmp           cykl1_end            

cykl1_1:           mov.l           #0,ER5               
         sub.l           #1,ER3               
         mov.b       @(string,ER3),R4L      
         cmp.b        #32,R4L               
         ble           cykl1_spa            

cykl1_word:   
         add.l          #1,ER5               
         cmp.l          #0,ER3               
         beq          cykl1_print            
         
         sub.l          #1,ER3               
         mov.b      @(string,ER3),R4L      
         cmp.b       #32,R4l               
         bgt          cykl1_word         
         
         add.l          #1,ER3               
         jmp          cykl1_print            

cykl1_spa:   
         add.l          #1,ER5               
         cmp.l          #0,ER3            
         beq          cykl1_print            
         
         sub.l          #1,ER3               
         mov.b      @(string,ER3),R4L      
         cmp.b       #32,R4l               
         ble          cykl1_spa            
         add.l          #1,ER3               

cykl1_print:
         mov.l          ER3,ER6               

cykl1_print_1:         
         sub.l          #1,ER5               
         mov.b      @(string,ER6),R4L      
         mov.b       R4L,@buffer_out         
         
         mov.w      #PUTC,R0            
         mov.l         #par2,ER1            
         jsr        @syscall
         add.l         #1,ER6               
         cmp         #0,ER5               
         bne         cykl1_print_1         
         jmp         cykl1               

cykl1_end:         
         mov.w      #PUTS,R0            
         mov.l         #par_row,ER1         
         jsr        @syscall      
         jmp         begin               

inp_str:
         mov.l         #0,ER3               
         
cykl:
         mov.w      #GETC,R0         
         mov.l         #par1,ER1            
         jsr        @syscall
         
         mov.b     @buffer_in,R4L         
         cmp.b      #13,R4L               
         beq         cykl_end            
         
         cmp.l         #slm,ER3            
         beq         cykl               
         
         mov.b      R4L,@(string,ER3)    
         add.l         #1,ER3            
         jmp         cykl               

cykl_end:   
         mov.w      #GETC,R0            
         mov.l         #par1,ER1            
         jsr        @syscall
         rts                           
         
         .end

Sten

Re:Assembler - problém s češtinou?
« Odpověď #9 kdy: 28. 05. 2014, 18:39:47 »
Tak je to přesně to, co jsem psal. BGT a BLE jsou znaménková (signed) porovnání a čeština má typicky nastavený 8. bit, tj. u znaménkových porovnání se tváří jako záporná čísla, která jsou samozřejmě menší než 32. Nahraďte je bezznaménkovými BHI a BLO.

Sten

Re:Assembler - problém s češtinou?
« Odpověď #10 kdy: 28. 05. 2014, 18:42:11 »
Tak je to přesně to, co jsem psal. BGT a BLE jsou znaménková (signed) porovnání a čeština má typicky nastavený 8. bit, tj. u znaménkových porovnání se tváří jako záporná čísla, která jsou samozřejmě menší než 32. Nahraďte je bezznaménkovými BHI a BLO.

Oprava: bezznaménková verze BLE je BLS, BLO je bezznaménková verze BLT.

Elune

Re:Assembler - problém s češtinou?
« Odpověď #11 kdy: 30. 05. 2014, 16:54:24 »
Moc díky za pomoc. :)