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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.08.2013, 18:35   #1
Haric_110
Форумчанин
 
Регистрация: 03.03.2013
Сообщений: 102
Вопрос Моя первая программа

Я только что окончил школу, программированию на ассемблере там не учили (там преподают QBasic). Я решил попробовать научиться самостоятельно, но увы, не выходит.
Мне нужна помощь.
Первые простейшие примеры из учебника не получается корректно скомпилировать. Я использую masm32. Вот один из примеров:

Код:
; dosout.asm
; Выводит на экран все ASCII-символы.
; 
		.model	tiny
		.code				; Начало COM-файла.
		org	100h
	
start:
		mov	cx, 256		; Вывести 256 символов
		mov	dl, 0			; Первый символ с кодом 00.
		mov	ax, 2			; Номер функции DOS "Вывод символа"

cloop:	int	21h			; Вызов DOS.
		inc	dl			; Увеличить dl на 1: следующий символ.
		test	dl, 0Fh		; Если dl не кратен 16,
		jnz	continue_loop 	; продолжить цикл,
		push	dx			; иначе, сохранить текущий символ,
		mov	dl, 0Dh		; вывести CR,
		int	21h			;
		mov	dl, 0Ah		; вывести LF,
		int	21h			;
		pop	dx			; восстановить текущий символ,

continue_loop:
		loop	cloop			; продолжить цикл.

		ret				; Завершение COM-файла.
		end	start
Насколько я понимаю, при использовании модели памяти TINY данные, код и стек хранятся в одном сегменте, но компилятор жалуется на отсутствие
сегмента стека. Почему?

Haric_110 вне форума Ответить с цитированием
Старый 25.08.2013, 18:43   #2
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

ключ /t при линковке добавляйте.
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 25.08.2013, 19:38   #3
Haric_110
Форумчанин
 
Регистрация: 03.03.2013
Сообщений: 102
По умолчанию

Добавил. Сегмент стека больше не спрашивает.
Но всё равно что-то не так. При запуске программы на какое-то мгновение появляется что-то вроде "Не удается...",
я не успеваю прочитать, но понимаю, что программа не работает. Может у меня в тексте ошибка, или с ассемблером что-то не так?
Haric_110 вне форума Ответить с цитированием
Старый 25.08.2013, 20:50   #4
asmprog
Пользователь
 
Регистрация: 10.08.2013
Сообщений: 67
По умолчанию

Номер ф-ции должен быть в регистре AH, а вы его в AL суете - правильно так
Код:
		mov	ax, 0200h			; Номер функции DOS "Вывод символа"
asmprog вне форума Ответить с цитированием
Старый 25.08.2013, 21:26   #5
Haric_110
Форумчанин
 
Регистрация: 03.03.2013
Сообщений: 102
По умолчанию

Да, действительно ошибся. Исправил, вот так:
Код:
	mov	ah, 2		; Номер функции DOS "Вывод символа"
и перекомпилировал, но результат тот же что и был. Спасибо за замечание.

Последний раз редактировалось Haric_110; 25.08.2013 в 21:34.
Haric_110 вне форума Ответить с цитированием
Старый 25.08.2013, 21:36   #6
asmprog
Пользователь
 
Регистрация: 10.08.2013
Сообщений: 67
По умолчанию

Все работает.
Код:
; dosout.asm
; Выводит на экран все ASCII-символы.
; 
.model tiny
.code
org 100h
start:
		mov	cx, 256		; Вывести 256 символов
		mov	dl, 0			; Первый символ с кодом 00.
		mov	ax, 0200h			; Номер функции DOS "Вывод символа"

cloop:	int	21h			; Вызов DOS.
		inc	dl			; Увеличить dl на 1: следующий символ.
		test	dl, 0Fh		; Если dl не кратен 16,
		jnz	continue_loop 	; продолжить цикл,
		push	dx			; иначе, сохранить текущий символ,
		mov	dl, 0Dh		; вывести CR,
		int	21h			;
		mov	dl, 0Ah		; вывести LF,
		int	21h			;
		pop	dx			; восстановить текущий символ,

continue_loop:
		loop	cloop			; продолжить цикл.

		ret				; Завершение COM-файла.
		end	start
Код:
c:\masm32\bin>ml /AT /c dosout.asm
Microsoft (R) Macro Assembler Version 6.14.8444
Copyright (C) Microsoft Corp 1981-1997.  All rights reserved.

 Assembling: dosout.asm

c:\masm32\bin>ulink /Tdc dosout.obj
UniLink v1.07 [beta] (build 5.03)
Код:
c:\masm32\bin>dosout.com
 ☺☻♥♦ ♠
♫☼
►◄↕‼¶§▬↨↑↓→←∟↔▲▼
 !"#$%&'()*+,-./
0123456789:;<=>?
@ABCDEFGHIJKLMNO
PQRSTUVWXYZ[\]^_
`abcdefghijklmno
pqrstuvwxyz{|}~⌂
АБВГДЕЖЗИЙКЛМНОП
РСТУФХЦЧШЩЪЫЬЭЮЯ
абвгдежзийклмноп
░▒▓│┤╡╢╖╕╣║╗╝╜╛┐
└┴┬├─┼╞╟╚╔╩╦╠═╬╧
╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀
рстуфхцчшщъыьэюя
ЁёЄєЇїЎў°∙·√№¤■*
asmprog вне форума Ответить с цитированием
Старый 25.08.2013, 22:24   #7
Haric_110
Форумчанин
 
Регистрация: 03.03.2013
Сообщений: 102
По умолчанию

asmprog,
Сделал так, как вы показали, с опцией AT. Вот что получилось:


Пришлось переименовать линкер с link16 на Link, чтобы AT его видела, но результат такой же:
чёрный экран, на котором пробегает строчка, что "что-то не удаётся".
Haric_110 вне форума Ответить с цитированием
Старый 25.08.2013, 22:32   #8
asmprog
Пользователь
 
Регистрация: 10.08.2013
Сообщений: 67
По умолчанию

/AT в моем случае(более свежий MASM)
Код:
/AT Enable tiny model (.COM file)
и линкер я UniLink(от Юрия Харона - не проходили такого в школе?) использовал - переименовывать ничего не нужно

компилируйте так, как раньше получалось и запустите наконец из командной строки dosout.com, чтобы скопировать чего там конкретно не удается или dosout.com приложите к сообщению
asmprog вне форума Ответить с цитированием
Старый 25.08.2013, 23:49   #9
Haric_110
Форумчанин
 
Регистрация: 03.03.2013
Сообщений: 102
По умолчанию

Всё работает! Большое спасибо вам! Оказалось, что проблема в том, что у мена masm32 был не в корне диска, а в папке Assembler. В её имени 9 символов!
Haric_110 вне форума Ответить с цитированием
Старый 25.08.2013, 23:56   #10
asmprog
Пользователь
 
Регистрация: 10.08.2013
Сообщений: 67
По умолчанию

наздоровье! поздравляю с потерей низкоуровневой девственности=)
asmprog вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Моя первая программа. fragment Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 5 11.05.2010 11:46
Моя первая программа igroman Софт 27 12.03.2009 20:23
Моя первая программа)) Dr.Badnezz Софт 9 06.12.2008 14:39
Моя первая программа NikLik Софт 4 20.07.2008 00:24