Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.11.2013, 16:49   #1
хирург-любитель
 
Регистрация: 07.11.2013
Сообщений: 5
По умолчанию что-то выходит, но не то

Доброго времени суток, уважаемые форумчане.
Есть простая задача - вывести на экран фразу, используя алфавит. Как человек не очень оригинальный, решил вывести "Happy New Year". Вот только выводится совсем не то, что надо. Подскажите, пожалуйста, в чём мой косяк, а то в отладчике вроде бы проблему и вижу, а вот как исправить - ума не приложу.

P.S. Объяснять, как пытался это реализовать, наверное, не стоит - и так всё видно. Используемый ассемблер - TASM.

Код:
.model large
stack 256
.data
str_3	db 'abcdefghijklmnopqrstuvwxyz $'
str_4	dw 7,0,15,15, 24,29, 13, 4, 22,29, 24, 4, 0, 17
	ch1 db  1 dup(?)
	db "$"
.code
start:
	mov AX, @data
	mov DS, AX

	xor ax, ax		
	mov cx, 14
	mov si, 0
go:
	xor bx, bx
	mov ah, 09h
	mov bx, 0
	mov bx, str_4[si]
	mov al, str_3[bx]
	mov ch1, al
	lea dx, ch1
	int 21h
	inc si
loop go
	
	mov ax, 4c00h
 	int 21h

end start

Последний раз редактировалось хирург-любитель; 07.11.2013 в 18:43.
хирург-любитель вне форума Ответить с цитированием
Старый 07.11.2013, 16:56   #2
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Емнип, 09h выводит строку с адреса DS:DX и до символа "$"
т.е. оно будет выводить не одну букву, как вы того хотели, а всю строку с указанной позиции и до завершающего "$"

Вам следует использовать функцию 02H, она в DL принимает код символа (одного символа) и выводит его на экран
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 07.11.2013, 17:26   #3
хирург-любитель
 
Регистрация: 07.11.2013
Сообщений: 5
По умолчанию

Никак нет. Выводит по одной букве, так как используется промежуточный массив ch1. Проблема пока упирается в эту строку
Код:
mov bx, str_4[si]
если сюда вместо str_4[si] поставим, например, 15, то на экран выйдет буква из массива str_3 с порядковым номером 15. А пока в bx записывается что-то не то.
хирург-любитель вне форума Ответить с цитированием
Старый 07.11.2013, 17:37   #4
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

Код:
.model large
.stack 256
.data
str_3	db 'abcdefghijklmnopqrstuvwxyz'
str_4	db 7,0,15,15, 26,29, 13, 4, 24,29, 26, 4, 0, 20

.code
start:
	mov AX, @data
	mov DS, AX

      mov cx,14
	mov si, offset str_4
      mov bx,offset str_3
go:
	lodsb
      xlatb
      int 29h
loop go
	xor ax,ax
      int 16h
	mov ax, 4c00h
 	int 21h

end start
Только я не понял, какая буква в латинском алфавите имеет номер 29?
vadimych вне форума Ответить с цитированием
Старый 07.11.2013, 17:39   #5
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Тогда si нужно на 2 увеличивать, а не на единицу. В str_4 же двойные слова, т.е. по 2 байта элементы еще один inc si перед loop go наверное не помешает


Цитата:
Только я не понял, какая буква в латинском алфавите имеет номер 29?
ТС имел в виду пробел. Только пробел будет 27й, а не 29й


p.s. tasm'a нет на компе, компилирую в уме => могу ошибаться
p.p.s. и все-же 02H здесь подошла бы больше
Благодарить в репутацию. Проклинать — туда же

Последний раз редактировалось Luuzuk; 07.11.2013 в 17:44.
Luuzuk вне форума Ответить с цитированием
Старый 07.11.2013, 17:47   #6
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

Luuzuk, пробел к алфавиту отношения не имеет. И в таблице символов он стоит намного раньше букв.
vadimych вне форума Ответить с цитированием
Старый 07.11.2013, 17:54   #7
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

vadimych: а вы код вообще читали, или решили с хода привнести "умную" мысль в топик? В str_4 хранятся смещения символов, которые находятся в str_3. А про таблицу символов (ascii) речь вообще никто ни вел.
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 07.11.2013, 17:59   #8
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

Luuzuk, да не, не читал, сразу написал. Буду знать, благодаря Вам, что пробел входит в латинский алфавит 27 символом.
vadimych вне форума Ответить с цитированием
Старый 07.11.2013, 18:03   #9
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Не стоит благодарности, просто в следующий раз постарайтесь быть внимательнее
--
26м, с нуля же нумерация *pardon*
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 07.11.2013, 18:06   #10
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

Конечно же. Последнее слово по-любому останется за Вами, знаток латинского алфавита. Я, если Вы не заметили, довёл код ТСа до рабочего состояния. Не читая.
vadimych вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка массива...Что та не выходит у меня.. Pavel Lapin Паскаль, Turbo Pascal, PascalABC.NET 1 13.11.2011 16:57
Не выходит из цикла RIO Общие вопросы по Java, Java SE, Kotlin 3 23.05.2010 23:54
при запуске винды какой-то синий экран с какими-то словами выходит и всё. Что за беда? SergeyPerm Windows 11 08.02.2009 18:30
компилировать не выходит 3.14oner Общие вопросы по Java, Java SE, Kotlin 5 08.11.2008 18:36
Что то не выходит на Паскале Bagsi Помощь студентам 4 14.11.2007 15:26