Маленькая проблема.

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Ответить
sbt_jacker
Сообщения: 4
Зарегистрирован: 23 сен 2009, 22:05

.model small
.Stack 100h
.Data

Buff db 'dadokoaowq$'

.Code

mov ax,@data ;
mov ds,ax ; Init data segment
mov cx,0 ; set CX = 0
mov si, offset buff ; get offset to BUFF

nonspace:
lodsb ; get symbol from DS:SI to AL
cmp al,'$' ; is the end of the string
je eos
inc cx ; increase counter
jmp nonspace ; get next symbol
eos:
or cx,cx ; is CX = 0 ?
jz Exit
call print_numb ; print
Exit:

mov ah,4Ch ; exit to DOS
int 21h

print_numb:
push ax ; save AX
push dx ; save DX
mov dl,cl ; get counter
add dl,30h ; convert digit to symbol -------------------------
mov ah,02h ; print it
int 21h
jmp exitprint_numb

exitprint_numb:
pop dx ; restore DX
pop ax ; restore AX
ret

END

Вот небольшая программа, которая должна считать количество символов в строке. До 9 символов считает и выводит нормально - а после 9, выводит не числом в 10ом формате а символом из АСКИ таблицы. Как это исправить? Если я не ошибаюсь нужно исправить строку
add dl,30h ; convert digit to symbol
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

После девятки цифр нет, она последняя :) нужно выводить уже не один символ на экран, а два. Первая будет частным от деления CL на 10, а вторая - остатком.
It's a long way to the top if you wanna rock'n'roll
sbt_jacker
Сообщения: 4
Зарегистрирован: 23 сен 2009, 22:05

somewhere писал(а):После девятки цифр нет, она последняя :) нужно выводить уже не один символ на экран, а два. Первая будет частным от деления CL на 10, а вторая - остатком.
Не могу разобрать с этими div, mod, и как мне потом записать и вывести два результата?(1 и второе число)

Допустим move al,Ah - так я сохраню 10 в al, и как мне поделить?
div dl, al
mod dl, al
?
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

mov al, dl
sub ah, ah
mov bl, 10
div bl
mov bl, al ; частное
mov bh, ah ; остаток
It's a long way to the top if you wanna rock'n'roll
sbt_jacker
Сообщения: 4
Зарегистрирован: 23 сен 2009, 22:05

.model small
.stack 100h
.data

msg db "Vvedite stroku: $"

max_ilg db 254
ilg db "$"
eilute db 254 dup ("$")

nln db 13, 10, "$"

.code
start:
mov ax, @data
mov ds, ax

;обнулить счетчик mov xx, 0
lea dx, msg
mov ah, 9
int 21h

lea dx, max_ilg ;считывание строки
mov ah, 10
int 21h

xor cx, cx ;обнуливаем

mov cl, [ilg]

lea si, eilute

lea dx, nln ;печатает ентер
mov ah, 9
int 21h


ciklas: ;mov al, [si]
lodsb ;inc si
cmp al, 40h ;проверяет буква ли(код символа больше 40h)
jle nebukva ;если нет - 'nebukva' - нe буква
cmp al, 05Bh ;проверяет интервал 41h-05Ah

jl bolshaja ;

cmp al, 07Bh ;проверяет меньше ли код чем 07Bh
jge nebukva ;
cmp al, 60h ;
;Здесь нужно вставить счетчик inc
nebukva:
xor dx, dx ;
mov dl, al ;
mov ah, 2
int 21h
mov [si-1], al

end_ciklas:
loop ciklas

lea dx, nln
mov ah, 9 ;enter
int 21h
;печатает результат

mov ax, 4c00h
int 21h ;konec raboty

bolshaja:
add al, 20h
xor dx, dx ;к коду бьольшой буквы добавляет 20h
mov dl, al ; печатает
mov ah, 2
int 21h
jmp end_ciklas ;возврат в цикл

end start






Нужна помощь)) вот код программы которая все большие буквы в строке превращает в маленькие). Мне нужно еще посчитать количество символов в этой строке..не знаю как сделать. Там полагаю в цикл надо вставить счетчик inc который будет считать..а потом его вывести
stolofka
Сообщения: 1
Зарегистрирован: 03 дек 2009, 01:58

ох и маленькая)



_________________
На заказ экструзия чего угодно
Ответить