Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Ассемблер? Это просто! Учимся программировать


РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты в разделе

cain52
Статус: 3-й класс
Рейтинг: 216
∙ повысить рейтинг »
Kdsfofwe21
Статус: 2-й класс
Рейтинг: 42
∙ повысить рейтинг »
Evgen aka Chuma
Статус: 6-й класс
Рейтинг: 0
∙ повысить рейтинг »

∙ Assembler

Номер выпуска:1736
Дата выхода:03.03.2019, 17:45
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:71 / 22
Вопросов / ответов:2 / 2

Консультация # 194743: Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: Я новичёк в программировании и мне нужен совет, но для начала я хотел бы узнать на что способен ассемблер и еще я слышал что есть несколько версии и если это так какая между ними разница, подскажите пожалуйста с чего начать ??? ...
Консультация # 194805: Уважаемые эксперты! Пожалуйста, ответьте на вопрос: компилятор - masm32 формат - .com на сколько данный код костыльный? написал код который выводит содержимое памяти на экран но что то мне кажется что есть скорее всего более простой код, хочу узнать мнение у экспертов
Код ::

Консультация # 194743:

Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:
Я новичёк в программировании и мне нужен совет, но для начала я хотел бы узнать
на что способен ассемблер и еще я слышал что есть несколько версии и если это так
какая между ними разница, подскажите пожалуйста с чего начать ???

Дата отправки: 20.02.2019, 20:01
Вопрос задал: САИД.92 (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Лысков Игорь Витальевич (Старший модератор):

Здравствуйте, САИД.92!
На вопрос "на что способен Ассемблер" ответ очень простой: Ассемблер способен на все, разумеется, в умелых руках.
А вот на вопрос "с чего начать?" ответ будет такой:
Сначала не мешало бы разобраться, как вообще функционирует система.
Нельзя писать абстрактные программы. Программы работают в определенной среде.
Предлагаю начать с изучения Си, с программ, использующих под Windows сервис WinApi.
Замечу, что программы на Ассемблере, если до него все же дойдет дело, вызывают те же подпрограммы.
Предлагаю начать с чтения книги Петзольда и установки какой-нибудь среды для Си.
Изучите принципы функционирования программ под Windows и попутно изучите Си.
Programming_Windows_95_Part_I.pdf (4.40 Mб)
Programming_Windows_95_Part_II.pdf (2.88 Mб)
Когда получите некоторые знания, заходите к нам, продолжим разговор.

Ответ на Ваш вопрос из мини-форума "И всё же какая версия <Ассемблера> нужна для виндовс ???"
будет такой: наиболее популярны masm32, fasm

Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 01.03.2019, 20:26
Рейтинг ответа:

НЕ одобряю +2 одобряю!

Консультация # 194805:

Уважаемые эксперты! Пожалуйста, ответьте на вопрос:

компилятор - masm32
формат - .com

на сколько данный код костыльный? написал код который выводит содержимое памяти на экран но что то мне кажется что есть скорее всего более простой код, хочу узнать мнение у экспертов

.286
model TINY
GBS segment

org 100h
start:
	mov ax, 3
	int 10h
	
	;подготовка для вывода текста
	mov ax, 0b800h
	mov es, ax
	xor di,di ;куда выводить символы
	mov si, offset buffer ;откуда читать
	mov cx, 10 ;количество символов для вывода
	mov dh, 31 ;цвет текста
	call drawCharHex ;вызов процедуры которая выводит текст
	;---- end ---
	
	mov ah, 10h
	int 16h
	int 20h
	
	
	;... 
	drawCharHex proc
		push bx
		xor bx, bx
		nextChar:
			xor ax, ax
			lodsb
			shl ax, 4
			shr al, 4
			
			mov bl, ah ;биты 4-8
			mov dl, byte ptr[drawCharHex_array + bx]
			mov es:[di], dx
			add di, 2
			
			mov bl, al ;биты 0-3
			mov dl, byte ptr[drawCharHex_array + bx]
			mov es:[di], dx
			add di,2
			
			mov dl, 00 ; пробел
			mov es:[di], dx
			add di,2
		loop nextChar
		
		pop bx
		ret
		drawCharHex_array db '0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'
	drawCharHex endp
	;...
	
	buffer db 23h,0a5h,55h,01h,00h,0ffh,17h,0a1h,0e4h,0ddh
GBS ends
end start

Дата отправки: 26.02.2019, 17:31
Вопрос задал: Arthur (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Зенченко Константин Николаевич (Старший модератор):

Здравствуйте, Arthur!

Рассмотрим Ваш код по участкам.
1)получение байта и разбиение на половинки:
Мнемоника Машинный код Время выполнения
xor ax, ax33 C0 2
lodsbAC5
shl ax, 4C1 E0 045+4=9
shr al, 4C0 E8 04 5+4=9
- 9 25

Варианты решения:
МнемоникаМашинный кодВремя выполнения
lodsbAC5
mov bl,16 B3 10 2
div blF6 F314
- 5 21
lodsbAC5
div CharHexF6 36 0157r17
- 5 22
lodsbAC5
aam 16 D4 10 16
- 3 21

Первый и последний варианты имеют одинаковое время выполнения, но разное количество байт и разное содержимое регистров на выходе:

  • ah-младшая часть, al-старшая часть;
  • ah-младшая часть, al-старшая часть;
  • ah-старшая часть, al-младшая часть.

При записи в видео-буфер, с помощью ES : DI , нужно писать первой старшую часть, потом младшую часть. Т.е. в третьем варианте ещё где то будет команда пересылки данных.

2)Преобразование числа в символ:
Мнемоника Машинный код Время выполнения
mov bl, ah8A DC2
mov dl, byte ptr[array + bx]8A 97 0157r 5
- 6 7
- 36+6+2+16 7+7+2

Варианты решения:
Мнемоника Машинный код Время выполнения
mov bx,offset arrayBB 0161 2
xlat D7 5
mov al,ah 8A C4 2
-3+1+16 7
- 33+2(1)+2+16 12
cmp al,9 3C 093
jbe @@01 76 023-7
add al,7 04 07 3
@@01:add al,'0' 04 303
-8 12-16
- 38+8+224-32

Где:
  • "-3" указан вариант, для старшей, младшей части байта и пробела.
  • Значение "3-7", это время вып олнения команды перехода, когда перехода по условию нет, и когда он есть.
  • "+16" длина дополнительной строки преобразования.


3)вывод на экран:
Мнемоника Машинный код Время выполнения
mov es:[di], dx 26: 89 15
add di,283 C7 02 2
- 6 3
-3 6+6+65+5+5

Вы уже используете строковую команду LODSB, а о такой команде как STOSW - забыли.
smile

Вы не используете подпрограммы, поэтому код drawCharHex занимает 64-е байта.
Пару замечаний, код пробела 3210=2016, но никак не 0, и цвет фона и текста желательно указывать в 16-ой системе, проще пересчитывать в будущем <Fon>< Color>.

У меня аналогичный код, был бы таким, всего 31 байт:
Код (Assembler) :: выделить код
  drawCharHex proc
      nextChar:
         lodsb
	aam	16
	Call	OutWord
	mov	al,' '
	stosw
      loop nextChar
      ret
OutWord:
	push	ax
	xchg	al,ah
	call	OutByte
	pop	ax
OutByte:
	cmp	al,9
	jae	@@01
	add	al,7
@@01:	add	al,'0'
	mov	ah,31
	stosw
	ret
   drawCharHex endp

Разницу, можно увидеть на картинке.
ps:время выполнения, указано .286
Удачи!

Консультировал: Зенченко Константин Николаевич (Старший модератор)
Дата отправки: 28.02.2019, 14:13
Прикреплённый файл: посмотреть » [12.1 кб]

5
нет комментария
-----
Дата оценки: 28.02.2019, 15:32

Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!


В избранное