Консультация № 194805
26.02.2019, 17:31
0.00 руб.
0 7 1
Уважаемые эксперты! Пожалуйста, ответьте на вопрос:

компилятор - 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

Обсуждение

давно
Старший Модератор
31795
6196
26.02.2019, 17:48
общий
Адресаты:
Я для получения дампа, использовал две программы:
  • 1) - сохранение на диск, некоторого участка памяти;
  • 2) - преобразование этого участка к читаемому виду.

Код:
                  00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F    Size:0000:FFFF
0000:0000 2D 59 15 5A 2C 5B 1A 5C 2B 5D 1B 5E 07 5F 0C 60 -Y·Z,[·\+]·^·_·`
0000:0010 29 61 1E 62 30 63 2E 64 20 65 12 66 21 67 22 68 )a·b0c.d e·f!g"h
0000:0020 23 69 17 6A 24 6B 25 6C 26 6D 32 6E 31 6F 18 70 #i·j$k%l&m2n1o·p
0000:0030 19 71 10 72 13 73 1F 74 14 75 16 76 2F 77 11 78 ·q·r·s·t·u·v/w·x
0000:0040 2D 79 15 7A 2C 7B 1A 7C 2B 7D 1B 7E 29 00 53 20 -y·z,{·|+}·~)·S
0000:0050 31 3B 00 32 3C 00 33 3D 00 34 3E 00 35 3F 00 36 1;·2<·3=·4>·5?·6
0000:0060 40 00 37 41 00 38 42 00 39 43 00 30 44 00 21 85 @·7A·8B·9C·0D·!…
0000:0070 00 40 86 00 2B 52 00 2D 53 00 68 47 00 6B 4F 00 ·@†·+R·-S·hG·kO·
0000:0080 3F 49 00 2F 51 00 23 00 00 41 00 00 42 00 00 43 ?I·/Q·#··A··B··C
0000:0090 00 00 44 00 00 26 00 00 2A 00 00 2E 00 00 52 00 ··D··&··*··.··R·
0000:00A0 00 72 00 00 28 00 00 29 00 00 51 00 00 5E 00 00 ·r··(··)··Q··^··
0000:00B0 0B 50 3B 00 51 3C 00 52 3D 00 53 3E 00 77 3D 00 ·P;·Q<·R=·S>·w=·
0000:00C0 78 3E 00 74 3F 00 75 40 00 71 41 00 72 42 00 70 x>·t?·u@·qA·rB·p
0000:00D0 44 00 0C 40 52 00 41 48 00 42 50 00 43 4D 00 44 D··@R·AH·BP·CM·D
0000:00E0 4B 00 48 47 00 4B 4F 00 4D 3F 00 55 51 00 56 49 K·HG·KO·M?·UQ·VI
0000:00F0 00 5A 0F 01 69 00 00 01 02 00 02 01 00 0F 01 13 ·Z··i···········
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
402031
115
26.02.2019, 18:13
общий
Адресаты:
То что есть и другие варианты решения данной задачи, в этом можешь не сомневаться.
Сколько писателей, столько и вариантов.
давно
Старший Модератор
31795
6196
28.02.2019, 14:13
общий
это ответ
Здравствуйте, Arthur!

Рассмотрим Ваш код по участкам.
1)получение байта и разбиение на половинки:
[table][row][col]Мнемоника [/col][col]Машинный код [/col][col]Время выполнения[/col][/row][row][col]xor ax, ax[/col][col]33 C0 [/col][col] 2 [/col][/row][row][col]lodsb[/col][col]AC[/col][col]5[/col][/row][row][col]shl ax, 4[/col][col]C1 E0 04[/col][col]5+4=9[/col][/row][row][col]shr al, 4[/col][col]C0 E8 04 [/col][col]5+4=9[/col][/row][row][col] - [/col][col] 9 [/col][col]25[/col][/row][/table]
Варианты решения:
[table][row][col]Мнемоника[/col][col]Машинный код[/col][col]Время выполнения[/col][/row][row][col]lodsb[/col][col]AC[/col][col]5[/col][/row][row][col]mov bl,16 [/col][col]B3 10[/col][col] 2[/col][/row][row][col]div bl[/col][col]F6 F3[/col][col]14[/col][/row][row][col] - [/col][col] 5 [/col][col] 21[/col][/row][row][col]lodsb[/col][col]AC[/col][col]5[/col][/row][row][col]div CharHex[/col][col]F6 36 0157r[/col][col]17[/col][/row][row][col] - [/col][col] 5 [/col][col] 22 [/col][/row][row][col]lodsb[/col][col]AC[/col][col]5[/col][/row][row][col]aam 16 [/col][col] D4 10[/col][col] 16[/col][/row][row][col] - [/col][col]3 [/col][col] 21[/col][/row][/table]
Первый и последний варианты имеют одинаковое время выполнения, но разное количество байт и разное содержимое регистров на выходе:
  • ah-младшая часть, al-старшая часть;
  • ah-младшая часть, al-старшая часть;
  • ah-старшая часть, al-младшая часть.

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

2)Преобразование числа в символ:
[table][row][col]Мнемоника [/col][col]Машинный код [/col][col]Время выполнения[/col][/row][row][col]mov bl, ah[/col][col]8A DC[/col][col]2 [/col][/row][row][col]mov dl, byte ptr[array + bx][/col][col]8A 97 0157r [/col][col] 5[/col][/row][row][col] - [/col][col] 6 [/col][col] 7[/col][/row][row][col] - 3[/col][col]6+6+2+16[/col][col] 7+7+2 [/col][/row][/table]
Варианты решения:
[table][row][col]Мнемоника [/col][col]Машинный код [/col][col]Время выполнения[/col][/row][row][col]mov bx,offset array[/col][col]BB 0161 [/col][col]2[/col][/row][row][col]xlat [/col][col]D7 [/col][col] 5[/col][/row][row][col]mov al,ah [/col][col]8A C4 [/col][col]2 [/col][/row][row][col]-[/col][col]3+1+16[/col][col] 7[/col][/row][row][col]- 3[/col][col]3+2(1)+2+16[/col][col] 12[/col][/row][row][col]cmp al,9 [/col][col] 3C 09[/col][col]3[/col][/row][row][col] jbe @@01[/col][col] 76 02[/col][col]3-7 [/col][/row][row][col] add al,7[/col][col] 04 07[/col][col] 3[/col][/row][row][col]@@01:add al,'0' [/col][col] 04 30[/col][col]3 [/col][/row][row][col] -[/col][col]8 [/col][col]12-16 [/col][/row][row][col] - 3[/col][col]8+8+2[/col][col]24-32[/col][/row][/table]
Где:
  • "-3" указан вариант, для старшей, младшей части байта и пробела.
  • Значение "3-7", это время выполнения команды перехода, когда перехода по условию нет, и когда он есть.
  • "+16" длина дополнительной строки преобразования.


3)вывод на экран:
[table][row][col]Мнемоника [/col][col]Машинный код [/col][col]Время выполнения[/col][/row][row][col]mov es:[di], dx [/col][col] 26: 89 15[/col][col] [/col][/row][row][col]add di,2[/col][col]83 C7 02 [/col][col]2 [/col][/row][row][col]- [/col][col]6 [/col][col]3 [/col][/row][row][col] -3 [/col][col] 6+6+6[/col][col]5+5+5 [/col][/row][/table]
Вы уже используете строковую команду LODSB, а о такой команде как STOSW - забыли.


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

У меня аналогичный код, был бы таким, всего 31 байт:
[code lang=asm] 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[/code]
Разницу, можно увидеть на картинке.
ps:время выполнения, указано .286
Удачи!
Прикрепленные файлы:
b112d88b68727036797e96f24639b636399dd948.jpg
5
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
401281
56
28.02.2019, 15:48
общий
Адресаты:
Спасибо за столь подробный ответ, есть к чему стремится, заодно вспомнил команду xlat читал в книге и забыл про неё, а вот в коде у вас есть такая строчка " @@01: " это метка такая?
давно
Старший Модератор
31795
6196
01.03.2019, 10:21
общий
Адресаты:
Цитата: Arthur
" @@01: " это метка такая?

Да, это метка, досталась в наследство от Паскаля, этот гад, в ассемблерных вставках другие метки не понимает.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
402218
66
08.03.2019, 13:05
общий
Адресаты:
подскажите плиз. а есть ли сводная таблица, как та которую Вы написали в ответе, машинный код и количества тактов за команду
давно
Старший Модератор
31795
6196
08.03.2019, 14:01
общий
Адресаты:
Конечно, ищите Intel® 64 and IA-32 Architectures Software Developer’s Manual Combined Volumes: 1, 2A, 2B, 2C, 2D, 3A, 3B, 3C, 3D and 4, это полное описание (24.1 Мб), весь второй раздел посвящен командам.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа