Функция lods & задача

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

Модератор: Andy

Ответить
xpymep
Сообщения: 53
Зарегистрирован: 08 дек 2004, 21:42
Контактная информация:

У мя есть задача:
"Есть строка в которой задан некий текст. Вывести все слова в строке с новой строчки"
И вот как я ее себе представляю сделать:

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

data segment
 string db "some words","$"
data ends
code segment
 assume ds:data,cs:code,es:data
start:
 mov ax,data
 mov ds,ax 
 mov es,ax ; настройка es и ds
 mov al,' ' ; здесь храниться символ пробела
cld ; сбрасываю df
lea di,string ; думаю тут все ясно
mov cx,10 ; длина строки
repne scas string ; ищу пробел
; на этом мой код обрывается
Дальше, я думаю, что надо использовать функцию lods для того чтобы загрузить строку и вывести ее на экран. Одна проблема: я не знаю ее синтаксиса ( :) ). Подскажите, плз. У кого есть варианты на альтернативное решение задачи тоже прошу написать ее решение здесь. Заранее спасибо.[/code]
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

{lodsb} = {mov al, es:[di]; inc di}. И никаких "загрузок" строк для вывода на экран :)
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Andy
Сообщения: 238
Зарегистрирован: 17 фев 2004, 08:15
Откуда: Минск

{lodsb} = {mov al, es:[di]; inc di}.
Romeo, DI - это stos'ы. lods'ы - SI. ;)
У кого есть варианты на альтернативное решение задачи тоже прошу написать ее решение здесь. Заранее спасибо

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

	.model tiny
	.code
	org 100h
start:
	mov	ax,3
	int	10h
	mov	di,offset strng
	mov	si,di
	dec	si	; для коррекции первого слова (перед ним нет пробела!)
getnext:
	mov	al,byte ptr [di]

	or	al,al ; конец строки? (у нас строка завершается нулем)
	jz	eol
	
	cmp	al,' '
	jnz	getnextchar
eol:
	mov	cx,di
	sub	cx,si
	
	push	di
	push	di
	
	inc	si
	mov	di,offset wordbuf
	rep	movsb
	mov	word ptr [di],0a0dh ; плюс перейти на начало новой строки
	mov	byte ptr [di+2],'$'

	pop	di
	pop	si
	
	mov	ah,9
	mov	dx,offset wordbuf
	int	21h
	
	cmp	byte ptr [di],0
	jz	exitapp
	
getnextchar:
	inc	di
	jmp	getnext
exitapp:
	ret
	
strng	db "http://www.developing.ru is the best site in the world!",0
wordbuf	db 32 dup(?)
end	start
*provided AS IS
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Верно. {lodsb} = {mov al, ds:[si]; inc si}. Подзабыл уже, давно на asm не писал :)
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
xpymep
Сообщения: 53
Зарегистрирован: 08 дек 2004, 21:42
Контактная информация:

Спасибо большое!
Ответить