Сейчас на форуме: asfa, bartolomeo, hgdagon (+6 невидимых)

 eXeL@B —› Программирование —› Перевод строк!
Посл.ответ Сообщение

Ранг: 3.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 29 мая 2006 20:12
· Личное сообщение · #1

Люди! Я новичек в АСМе и не могу решить такую задачу:
С клавиатуры вводится строка с пробелами и после нажатия Enter все слова должны выстраиваться в столбик. Пытался решить вот, так, но что-то не получается,пожалуйста помогите:




;Tasm Zad5_4.asm
;Tlink Zad5_4.obj/t/x
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.model tiny
.code
org 100h ; Типа СОМ файл.
Start:
;-------------------------------------------------------
Mov ah,9h ;Предложение
Lea dx,Text ;ввести
Int 21h ;строку.
;-------------------------------------------------------
Mov ah,0Ah ;Собственно
Lea dx,max ;Cам ввод
int 21h ;Cтроки.
;-------------------------------------------------------
xor bx,bx
mov bl,max+2 ;Адрес начала строки
xor cx,cx
mov cl,max+1 ;Кол-во введеных символов.
Prov:
mov al,[bx] ;Очередной символ.
cmp al,' ' ;Сравниваем с пробелом.
je viv ;Если равно, то
sss:
inc bx
Loop Prov
jmp endd
Viv:
mov [max+1-bx+1],10
mov [max+1-bx+2],13
mov [max+1-bx+3],'$'
mov ah,9h
lea dx,max
int 21h
jmp sss
;-------------------------------------------------------
Endd:
RET ;Выход из проги.
;=====================~Переменные.~=====================
Text db "Введите строку.",10,13,'$'
max db 255
len db ?
stroka db 255 dup(?)
db ?
ent db 10,13,'$'
End Start



Ранг: 123.7 (ветеран)
Активность: 0.10
Статус: Участник
1nn0$/100

Создано: 29 мая 2006 20:25
· Личное сообщение · #2

Lenin2917 пишет:
cmp al,' ' ;Сравниваем с пробелом.

А что ТАСМ на такое не ругается??? Я бы написал так: cmp al, 20h

-----
Blame the victim!




Ранг: 3.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 29 мая 2006 20:27
· Личное сообщение · #3

1nn0cent пишет:
А что ТАСМ на такое не ругается??? Я бы написал так: cmp al, 20h

Не, все ничтяк, хавает и еще просит



Ранг: 74.4 (постоянный)
Активность: 0.050
Статус: Участник

Создано: 29 мая 2006 20:37
· Личное сообщение · #4

lea edi,stroca
@@:
lea esi,buf ;<- временный буфер
@1:
mov al,[di] ; n-й символ
cmp al,' '
je vivod
mov [si],al
inc si
inc di
cmp al,13 <- если код конца строки
je vivod
jmp @1

vivod:
mov [si],10
mov [si+1],13
выводиш строчку
cmp al,13 <- если код конца строки
je exit
jmp @b



Ранг: 3.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 29 мая 2006 21:28
· Личное сообщение · #5

WoLFeR
Чето ругается на
mov [si],10
mov [si+1],13





Ранг: 282.8 (наставник), 24thx
Активность: 0.260
Статус: Участник
win32.org.ru

Создано: 29 мая 2006 21:31
· Личное сообщение · #6

Lenin2917 пишет:
mov [si],10
mov [si+1],13

может 10h и 13h

-----
may all your PUSHes be POPed!




Ранг: 74.4 (постоянный)
Активность: 0.050
Статус: Участник

Создано: 29 мая 2006 21:33
· Личное сообщение · #7

Guru_eXe пишет:
может 10h и 13h

Нет

Пробуй
mov byte ptr [si],10
mov byte ptr [si+1],13

А вообще сказалбы что точно пишет, какая именно ошибка.



Ранг: 3.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 29 мая 2006 22:01
· Личное сообщение · #8

Блин! Простите мою навязчивость, но я пытаюсь вывести эти строки, а он мне выдают кучу всякого "Г"
Вывожу так:
mov byte ptr [si],10
mov byte ptr [si+1],13
mov byte ptr [si+2],'$'
mov dx,[si]
mov ah,9h
int 21h



Ранг: 158.4 (ветеран), 123thx
Активность: 0.140.49
Статус: Участник

Создано: 29 мая 2006 22:05
· Личное сообщение · #9

mov byte ptr [si],0ah
mov byte ptr [si+1],0dh
...
mov dx, si
...



Ранг: 74.4 (постоянный)
Активность: 0.050
Статус: Участник

Создано: 29 мая 2006 22:06 · Поправил: WoLFeR
· Личное сообщение · #10

mov dx,[si] <- помоему тут лажа
mov ah,9h
int 21h

Если мне не изменяет память то в DX должен быть адрес начала строки. А ты туда что пихнул?

Lea dx,buf <- так
mov ah,9h
int 21h

А вообще запускай под отладчиком и смотри.



Ранг: 15.3 (новичок)
Активность: 0.020
Статус: Участник

Создано: 29 мая 2006 22:09
· Личное сообщение · #11

Zad5_4.asm - студент который хочет сдать зачет и не хочет учиться,
гык turbodebug в руки и вперед



Ранг: 213.5 (наставник)
Активность: 0.120
Статус: Участник
забанен

Создано: 30 мая 2006 00:03
· Личное сообщение · #12

Lenin2917
Если уже решил на асм прыгнуть, то забудь про Dos, он тебе поможет только в командах разобраться, а времени сожжет уйму, возьми, купи справочник Юрова “Assembler: специальный справочник” и пересядь на MASM как минимум, проблем меньше будет!
Dos это уже прошлый век. Отладчик в руки возьми лучше для начала Олю и начинай MSDN листать. (В принципе тебе решать, как дальше путь к ассемблеру прокладывать, просто все это совет от чайника и IDE RadASM юзай.)

-----
ЗЫ: истЕна где-то рядом, Welcome@Google.com




Ранг: 3.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 30 мая 2006 11:52
· Личное сообщение · #13

Valenok Pirojkov
Ты не прав, это я просто нумерую свои проги так, например связаные с арифметикой 1, тоесть zad1_n и т.д.
Demon666
На мой взгляд начать нужно с ДОСа ибо на на нем учиться лучше, всякие там сегментации и т.д
WoLFeR
Я наверное уже совсем достал?Но у меня вывод зацикливается, и на экран выводится только первое слово после чего все виснит. На всякий случай привожу весь текст кода.
.model tiny
.code
org 100h ; Типа СОМ файл.
Start:
;==============================================
Mov ah,9h ;Предложение
Lea dx,Text ;ввести
Int 21h ;строку
;==============================================
Mov ah,0Ah ;Собственно
Lea dx,stroka ;Cам ввод
int 21h ;Cтроки.
;==============================================

lea di,stroka+2
NACH:
lea si,buf
prover:
mov al,[di]
cmp al,' '
je vivod
mov [si],al
inc si
inc di
cmp al,13
je exit
jmp prover
vivod:
mov byte ptr [si],10
mov byte ptr [si+1],13
mov byte ptr [si+2],'$'
mov ah,9h
lea dx,buf
int 21h
je exit
jmp prover
Exit:
Ret
buf db 255 dup(?)
stroka db 255
text db "Введите строку!",10,13,'$'
End Start



Пробовал перед выводам ставить
inc si
inc di
Так он, вообще ниче не выводит!



Ранг: 213.5 (наставник)
Активность: 0.120
Статус: Участник
забанен

Создано: 30 мая 2006 19:27
· Личное сообщение · #14

Lenin2917
Попробую чуть разжевать, в книге Юрова практически полностью описываются команды микропроцессора Pentium, да и я не встречал более полного описания команд.
В Dos`е дальше, чем за метр ты не прыгнешь, что для нашего века очень мало, чтобы расширить возможности программиста!

[флуд]
Для понимания, что такое сегментация ума много не надо, а вот что такое защищенный режим, виртуальная машина и т. д. тут репу чуток надо почесать я же тебе предлагаю сэкономить время.
[\флуд]

вот код:
lea di,stroka+2
lea si,buf
prover:
mov al,[di]
cmp al,' '
je vivod
mov [si],al
inc si
inc di
cmp al,13
je exit
jmp prover
vivod:
mov byte ptr [si],10
mov byte ptr [si+1],13
inc di
add si,2
jmp prover
Exit:
mov byte ptr [si],10
mov byte ptr [si+1],13
mov byte ptr [si+2],'$'
mov ah,9h
lea dx,buf
int 21h
Ret

Это исправляет только логику, а сегментацию как ты там говорил, будешь учить, так учи, все проблемы остаются именно там, а то так и не будет работать твой код!

Guru_eXe пишет:
может 10h и 13h

Насмешил!

-----
ЗЫ: истЕна где-то рядом, Welcome@Google.com




Ранг: 162.2 (ветеран)
Активность: 0.090
Статус: Участник

Создано: 31 мая 2006 06:13
· Личное сообщение · #15

[флуд]
Люди, а как насчёт поменять si и di местами и пользоваться lodsb, stosb?
[\флуд]



Ранг: 3.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 31 мая 2006 17:21
· Личное сообщение · #16

Demon666
Спасибо за помощ!


 eXeL@B —› Программирование —› Перевод строк!
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати