Страница 1 из 1

Изменение строчных букв на заглавные в PSP

Добавлено: 10 фев 2008, 00:26
kosya4ok
Всем привет!
У меня возникла такая задача. Из PSP перевести строчные буквы в заглавные.
Вот не получается связать два куска следующего кода:
Чтение из PSP параметра командной строки:

Код: Выделить всё

len_par_addr  EQU        80H

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

                ASSUME     CS:CODE,DS :D ATA,ES :D ATA,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
  cld                          
  rep movsb     
                                
  mov        DS,AX             

@900:
  mov      al,num_par
  mov      ah,4ch
  int      21h
А это перевод строчных букв в заглавные:

Код: Выделить всё

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
Я так понимаю эти куска связывюся чеез какую то из видом адресации в ассемблере. Но вот пока ничего не получилось...

Re: Изменение строчных букв на заглавные в PSP

Добавлено: 11 фев 2008, 09:37
airyashov
ES Указывает на PSP

Код: Выделить всё

.model small
.stack 100h
.data
.code

.startup
	xor cx,cx	
	mov cl, es:[80h]
	jcxz exit
	mov si, 81h
up:
	mov al,es:[si]	; получить символ
	cmp al,'a'		; ниже "a"?
	jb  next_up
	cmp al,'z'		; более "z"?
	ja  next_up
	and BYTE PTR es:[si],11011111b	; преобразовать в верхний
next_up:
	inc si ; next char
	loop up
exit:
	mov ax, 4c00h
	int 21h
end

Re: Изменение строчных букв на заглавные в PSP

Добавлено: 14 фев 2008, 23:09
kosya4ok
Вы бы не могли дать небольшие комментарии к коду?
Например, как инструкция es:[80] определяет сколько символов + пробел введено в параметрах командной строки?
Я немного изменил вашу прогрмку так в том виде в котором вы написали не хотел принимать MASM.

Код: Выделить всё

cseg segment
assume cs:cseg
start:

;код

cseg ends
end start
Потестил, да в регистр ax происходит занос символом командной строки, но они не поднимаются в верхний регистр. И есче, например в коде который я писал самым верхним после того как считаются параметры они отображаются в сегменте данных, а у вас где их можно посмотреть?

Re: Изменение строчных букв на заглавные в PSP

Добавлено: 15 фев 2008, 13:16
airyashov
При загрузке exe файла es указывает на PSP в PSP есть DTA (буфер передачи данных) там содержится все что после имени файла (в частном случае).
es:[80h]-это количество символов в командной строке+CR (0Dh)
es:[81h]-это первый символ он всегда пробел. В данном случае es:[si] адресует символы командной строки

программа написана для Tasm

в al символ для сравнение, а преобразование к верхнему регистру сразу в памяти
and BYTE PTR es:[si],11011111b ; преобразовать в верхний

смотреть по адресу es:80h