Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для начинающих > Изменение строчных букв на заглавные в PSP


Автор: Kosya4ok 29.1.2008, 00:17
Всем добрый  вечер!
Возникла следующа задача. Требуется переписать параметры командной строки (начинаются с адреса 80h) которые вводятся строчными буквами  и преобразовать из в заглавные буквы. В инете нашел что 5 бит для заглавных равен 0, а для строчных 1.

Биты:  76543210          Биты:  76543210
               Буква A:  01000001       Буква a:  01100001
               Буква Z:  01011010       Буква z:  01111010

Код


len_par_addr  EQU        80H

DATA          SEGMENT
  str_par       DW        80 DUP (?)
  num_par     DB         0
DATA          ENDS

                ASSUME     CS:CODE,DS:DATA,ES:DATA,SS:NOTHING

begin:
  mov       ax,DATA           
  mov       ES,AX             

  mov       di,OFFSET str_par 
  mov       si,len_par_addr   
  mov       cl,[si]          

  cmp       cl,0
  je         @900             

  mov       ch,0                                  
  inc         si

  cmp      si,61h
  and      si,11011111b
  mov      ax,si

  cld                          
  rep movsb     
                                
  mov        DS,AX             

@900:
  mov      al,num_par
  mov      ah,4ch
  int      21h

Где я не правильно понимаю?

Автор: Mikl_ 29.1.2008, 11:16
Код

;A = 41h Z=5Ah a=61h z=7Ah
mov di,offset dest
mov si,offset src
cld 
a0: lodsb
test al,al; конец строки?
jz exit
cmp al,'a'
jb a1; в AL не строчная буква
cmp al,'z'
ja a1; в AL не строчная буква
and al,11011111b; строчные буквы преобразуем в прописные
a1: stosb
jmp a0
exit: stosb 

Автор: Kosya4ok 8.2.2008, 23:26
Спасибо за ответ. Но я уже немного раньше нашел кусок на асме по преобразованию символом из строчных в заглавные (например Юров) и дописал программу. Задача теперь стоит так. Свзяать кусочек преобразования символов
Код

data segment
n equ 10
stroka db "acvfgrndup"
data ends
code    segment 
    assume cs:code, ds:data, es:data, ss:nothing

start:
    mov ax,data
    mov ds,ax
    xor ax,ax

    mov cx,n
    lea bx,stroka
@m1:    mov al,[bx]
    cmp al,61h
    jb @next
    
    cmp al,71h
    ja @next
    
    and al,11011111b
    mov [bx],al
@next:    
    inc bx
    dec cx
    jnx @m1

@exit:
    mov ax,4c00h
    int 21h
code ends
end start

с кусочком который читает из PSP. См. выше...

Автор: Akina 9.2.2008, 00:36
Цитата(Kosya4ok @  29.1.2008,  01:17 Найти цитируемый пост)
Требуется переписать параметры командной строки (начинаются с адреса 80h)

81h

Цитата(Kosya4ok @  9.2.2008,  00:26 Найти цитируемый пост)
Задача теперь стоит так. Свзяать кусочек преобразования символов с кусочком который читает из PSP. См. выше... 

Код

cseg segment
assume cs:cseg

start:

   push ax
   push ds
   push es
   push si
   push di
   push cx

   mov ah,51h
   int 21h   
   mov ds,bx
   mov es,bx
   mov si,80h
   cld
   lodsb
   cbw
   mov cx,ax
   mov di,si
lbl1:
   lodsb
   cmp al,'a'
   jb lbl2
   cmp al,'z'
   ja lbl2
   and al,11011111b
lbl2:
   loop lbl1

   pop cx
   pop di
   pop si
   pop es
   pop ds
   pop ax

; в этот момент параметры "капитализированы"
; можно выполнять остальной код

   ret 

cseg ends
end start

Автор: Kosya4ok 9.2.2008, 23:59
Ээээ...Спасибо конефно за ответ. но с каким образом мона скушать ваш код?  smile 
Вашу вставку в какой фрагмент кода требуется вставить?Или он получается как самодостаточная программа? Я просто не сильно шарю в асме, но ваш код мне пока что абсолютно не понятен кроме некоторых моментов. Вы бы не могли более продробно объяснить что с ним делать и куда вставлять?

Автор: Akina 10.2.2008, 00:48
Цитата(Kosya4ok @  10.2.2008,  00:59 Найти цитируемый пост)
Вашу вставку в какой фрагмент кода требуется вставить?Или он получается как самодостаточная программа?

Ввел обрамление. Теперь это полностью самостоятельная программа. Место вставки остального кода также указано.
Обрамление следует откорректировать под свои нужды.
Цитата(Kosya4ok @  10.2.2008,  00:59 Найти цитируемый пост)
Я просто не сильно шарю в асме

Может, хватит плакаться?

Автор: Kosya4ok 14.2.2008, 23:17
А как наглядно можно посмотреть что программа правильно перевела параметры в верхний регистр?
Например в моей программы это позволили делать верхний код...

Автор: Akina 15.2.2008, 00:23
Код

cseg segment
assume cs:cseg

   org 100h

start:

   push ax
   push ds
   push es
   push si
   push di
   push cx

   mov ah,51h
   int 21h   
   mov ds,bx
   mov es,bx
   mov si,80h
   cld
   lodsb
   cbw
   mov cx,ax
   mov di,si
lbl1:
   lodsb
   cmp al,'a'
   jb lbl2
   cmp al,'z'
   ja lbl2
   and al,11011111b
lbl2:
   stosb
   loop lbl1

   pop cx
   pop di
   pop si
   pop es
   pop ds
   pop ax

; в этот момент параметры "капитализированы"
; можно выполнять остальной код

   mov ah,51h
   int 21h   
   mov ds,bx
   mov bx,80h
   mov dx,bx
   add bl,ds:[bx]
   inc bl
   mov byte ptr ds:[bx],'$'
   inc dx
   mov al,9
   int 21h

   ret 

cseg ends
end start

Автор: fish9370 27.2.2008, 00:50
Цитата(Kosya4ok @ 14.2.2008,  23:17)
А как наглядно можно посмотреть что программа правильно перевела параметры в верхний регистр?
Например в моей программы это позволили делать верхний код...

я бы посоветовал обзавестись дебаггером, в свое время их под дос было навалом..


2Akina, насколько я помню, 51h функция в свое время была недокументированна? но через нее можно было выйти на цепочку mcb,  и получить кучу другой полезной информации.. поправь если забыл..

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)