ассемблер
Цитата:
codesg segment para 'code'
assume cs:codesg, ds:codesg, ss:codesg, es:codesg
org 100h
begin:
call start
message db 'Введите строку: ', '$'
string label byte
symb db 19
real db ?
all db 20 dup (?),'$'
start proc near
mov ah, 00h
mov al, 03h
int 10h
mov dh, 12
mov dl, 02
mov bh, 00
mov ah, 02h
int 10h
mov ah, 09h
lea dx, message
int 21h
lea dx, string
mov ah, 0ah
int 21h
mov bl,real
mov bh,00
mov all[bx],'$'
lea dx, string+2
mov ah, 09h
int 21h
mov ah,4ch
int 21h
start endp
codesg ends
end begin
assume cs:codesg, ds:codesg, ss:codesg, es:codesg
org 100h
begin:
call start
message db 'Введите строку: ', '$'
string label byte
symb db 19
real db ?
all db 20 dup (?),'$'
start proc near
mov ah, 00h
mov al, 03h
int 10h
mov dh, 12
mov dl, 02
mov bh, 00
mov ah, 02h
int 10h
mov ah, 09h
lea dx, message
int 21h
lea dx, string
mov ah, 0ah
int 21h
mov bl,real
mov bh,00
mov all[bx],'$'
lea dx, string+2
mov ah, 09h
int 21h
mov ah,4ch
int 21h
start endp
codesg ends
end begin
Если можно опишите пожалуйста свой код с комментариями.
Подскажите плиз, что нужно написать в коде, что бы русские слова выводились не как закорючки. И как в предложении находить заглавные буквы?
P.S.: Я бы чиркнул, но у мну ща 64бт семёра, на ней не прёт. если хочешь сгоняй на cyberforum, там людей шаряших в асме хватает, авось и помогут.
Цитата: Dinar1623
Подскажите плиз, что нужно написать в коде, что бы русские слова выводились не как закорючки. И как в предложении находить заглавные буквы?
1) Пересохранить листинг в DOS-866 кодировке и скомпилировать (простой способ)
2)Проверяешь каждую букву, проверяешь её ASCII-код если он между 41h и 5Ah , прибавляешь к нему 20h , это для латинских, для кирилицы тоже самое, только проверяешь 2 диапазона - 80h-8Fh (+20h) и 90h-9Fh (+50h) буква Ё - отдельно
Я пока сделал вот что:
Цитата:
stacksg segment para stack 'Stack'
dw 32 dup(?) ;
stacksg ends
;---------------------------------------------
datasg segment para 'Data'
datasg ends
;--------------------------------------------
codesg segment para 'Code'
begin:
puts macro string:REQ ; Функция вывода строки на экран
push dx ;
push ax ;
mov dx, offset string ;
mov ah, 09h ;
int 21h ;
mov dl, 0Ah ;
mov ah, 02h ;
int 21h ;
mov dl, 0Dh ;
mov ah, 02h ;
int 21h ;
pop ax ;
pop dx ;
endm ;
.model small ; Программа .EXE
.data
len equ 100 ; Здесь устанавливается длина строки
StringS db len+1 dup(?) ; Здесь будет моя строка
StringB db len+1 dup(?) ; Здесь будет моя маленькая строка
msgEnteredS db "Vvedennaa malenkaa stroka: ", '$' ; Интерфейс
msgEnteredB db "Vvedennaa bolsaa stroka: ", '$'
msgEnter db "Vvedite stroky: ", '$'
.stack 100h
.code
main:
mov ax, @data ; В DS заносим адрес сегмента данных
mov ds, ax ;
puts msgEnter ; Приглашение к вводу строки
xor si, si
mov cx, len
input: ; Цикл ввода (посимвольно)
mov ah, 01h
int 21h
cmp al, 0Dh ; Проверка: не нажат ли Enter?
je next
mov StringS[si], al ; Заносим ASCII в строкуМ
cmp al, 41h ; Проверка
jl nots
cmp al, 5Ah ;
jg nots
sub al, 20h ; Получаем ASCII маленькой буквы
mov StringB[si], al ; И заносим его в строкуБ
nots:
mov StringB[si], al ; Заносим ASCII в строкуБ без изменений
inc si
loop input
next:
mov StringS[si], '$' ; добавление символа конца в строку
mov StringB[si], '$' ; добавление символа конца в строку
mov dl, 0Ah ; Просто курсор переводим на новую строку
mov ah, 02h ;
int 21h ;
mov dl, 0Dh ;
mov ah, 02h ;
int 21h ;
puts msgEnteredS ; И всё выводим
puts StringS ;
puts msgEnteredB ;
puts StringB ;
mov ah, 4Ch ; Выход
int 21h ;
end main
dw 32 dup(?) ;
stacksg ends
;---------------------------------------------
datasg segment para 'Data'
datasg ends
;--------------------------------------------
codesg segment para 'Code'
begin:
puts macro string:REQ ; Функция вывода строки на экран
push dx ;
push ax ;
mov dx, offset string ;
mov ah, 09h ;
int 21h ;
mov dl, 0Ah ;
mov ah, 02h ;
int 21h ;
mov dl, 0Dh ;
mov ah, 02h ;
int 21h ;
pop ax ;
pop dx ;
endm ;
.model small ; Программа .EXE
.data
len equ 100 ; Здесь устанавливается длина строки
StringS db len+1 dup(?) ; Здесь будет моя строка
StringB db len+1 dup(?) ; Здесь будет моя маленькая строка
msgEnteredS db "Vvedennaa malenkaa stroka: ", '$' ; Интерфейс
msgEnteredB db "Vvedennaa bolsaa stroka: ", '$'
msgEnter db "Vvedite stroky: ", '$'
.stack 100h
.code
main:
mov ax, @data ; В DS заносим адрес сегмента данных
mov ds, ax ;
puts msgEnter ; Приглашение к вводу строки
xor si, si
mov cx, len
input: ; Цикл ввода (посимвольно)
mov ah, 01h
int 21h
cmp al, 0Dh ; Проверка: не нажат ли Enter?
je next
mov StringS[si], al ; Заносим ASCII в строкуМ
cmp al, 41h ; Проверка
jl nots
cmp al, 5Ah ;
jg nots
sub al, 20h ; Получаем ASCII маленькой буквы
mov StringB[si], al ; И заносим его в строкуБ
nots:
mov StringB[si], al ; Заносим ASCII в строкуБ без изменений
inc si
loop input
next:
mov StringS[si], '$' ; добавление символа конца в строку
mov StringB[si], '$' ; добавление символа конца в строку
mov dl, 0Ah ; Просто курсор переводим на новую строку
mov ah, 02h ;
int 21h ;
mov dl, 0Dh ;
mov ah, 02h ;
int 21h ;
puts msgEnteredS ; И всё выводим
puts StringS ;
puts msgEnteredB ;
puts StringB ;
mov ah, 4Ch ; Выход
int 21h ;
end main
Но при ассемблировании выводит ошибку.
Какую?