Сейчас на форуме: _MBK_ (+5 невидимых)

 eXeL@B —› Вопросы новичков —› Прошу помоч разобраться с простейшей программой 2...
Посл.ответ Сообщение

Ранг: 2.6 (гость)
Активность: 0.010
Статус: Участник

Создано: 29 сентября 2010 09:45
· Личное сообщение · #1

Извините меня ещё раз господа программисты...
Я вот с какой проблеммой сталкнулся, написал простую программу для вывода на монитор букв...
Как написано в уроке на сайте: bitfry.narod.ru/04.htm
- "Например, могу предложить задание: Сделайте так, чтоб эта программа выводила на экран буквы ABCDEFGH и при этом не содержала буквы в явном виде до выполнения кода. Если у вас это получится, ставлю вам 4 балла (или по новой системе 94 ."
ABCDIFGH выводятся, я смог, но вот проблема, немогу вывести остальные буквы... Если идти тем же путём, то получаются каракули на выводе и проц пищит как мышь...

Посоветуйте, что я делаю не так... Программу выкладываю на обозрение (exp01 - работает, exp02 - с дописанными буквами "IJKL" неработает) + расскажите зачем в В Hiew'e в конце программы надо писать 00 00 00 00 24
24 понятно - это знак "$" а нулевые байты зачем??? Автор пока необъясняет, но интересно...

4ed9_28.09.2010_CRACKLAB.rU.tgz - exp.rar




Ранг: 527.7 (!), 381thx
Активность: 0.160.09
Статус: Участник
Победитель турнира 2010

Создано: 29 сентября 2010 13:51
· Личное сообщение · #2

Причина как раз в том что не разобрался для чего 00 00 00 00 24. А это и есть буфер в который ты помещаешь выводимые символы. Этот буфер в исходной программе расположен по смещению 133h (смотри первую команду)

seg000:0100 mov bx, 133h

и расположен сразу после кода.

Добавив код для вывода следующих буков, ты отодвинул этот буфер (код удлиннился) и теперь он у тебя находится по смещению 149. Измени первую команду на

seg000:0100 mov bx, 149h

и будет тебе счастье.

-----
127.0.0.1, sweet 127.0.0.1




Ранг: 2.6 (гость)
Активность: 0.010
Статус: Участник

Создано: 29 сентября 2010 14:11 · Поправил: magistr011
· Личное сообщение · #3

Спасибо огромное, всё получилось!!! Я догадывался, что это буфер, пытался его расширить (нулей в конце побольше воткнуть) но до того, что надо сместить адрес я сам недошёл... Теперь бы разобраться как вычислять это смещение... Автор сайта наверное припас это на другую тему, а я лезу "поперёк батьки в пекло". Просто меня с самого начала интересовало, почему автор взял адрес "0133h", а не "0117" например или "0325", ведь вариантов много... OKOB Если Вам не жалко времени, расскажите как вычислить это смещение, если я захочу например ещё добавить код для нескольких букв...

Ещё раз благодарю Вас за помощь.




Ранг: 527.7 (!), 381thx
Активность: 0.160.09
Статус: Участник
Победитель турнира 2010

Создано: 29 сентября 2010 17:24 · Поправил: OKOB
· Личное сообщение · #4

программа в HIEW из урока приведенного тобой выглядит так:
Code:
  1. 00000000: BB3301         mov     bx,00133
  2. 00000003: 66C70701020304 mov     d,[bx],004030201
  3. 0000000A: 66810730303030 add     d,[bx],030303030
  4. 00000011: 8BD3           mov     dx,bx
  5. 00000013: B409           mov     ah,009
  6. 00000015: CD21           int     021
  7. 00000017: B410           mov     ah,010
  8. 00000019: CD16           int     016
  9. 0000001B: 66C70750505050 mov     d,[bx],050505050
  10. 00000022: 66812F1B1A1918 sub     d,[bx],018191A1B 
  11. 00000029: B409           mov     ah,009           
  12. 0000002B: CD21           int     021
  13. 0000002D: B410           mov     ah,010           
  14. 0000002F: CD16           int     016
  15. 00000031: CD20           int     020
  16. 00000033: 0000           add     [bx][si],al
  17. 00000035: 0000           add     [bx][si],al
  18. 00000037: 24             and     al,000


По адресу 33 (а это файловое смещение) начинается буфер с 4-мя нулями и $.
133 это смещение на этот же буфер при загрузке этого файла на исполнение в память. Т.е. в памяти начало твоей програмы сдвинуто на 100h (на размер PSP :ru.wikipedia.org/wiki/Program_Segment_Prefix)

Да и хватит ассемблировать в HIEW, переходи на компилятор. Тогда проблем со смещением не будет.

org 100h
mov bx, offset buffer
.....
int 20h
buffer db 4 dup(0), '$'

компилятор сам его вычислит.

-----
127.0.0.1, sweet 127.0.0.1





Ранг: 105.6 (ветеран), 36thx
Активность: 0.10
Статус: Участник

Создано: 29 сентября 2010 21:09
· Личное сообщение · #5

если очень хочеццо на асме прогить то скачай MASM



Ранг: 2.6 (гость)
Активность: 0.010
Статус: Участник

Создано: 30 сентября 2010 13:33
· Личное сообщение · #6

OKOB Благодарю
Всё, что я хотел получилось... Вот, выкладываю...

Dart Sergius Дойдёт дело и до MASMа...

Спасибо всем за помощь ещё раз.

8b3f_30.09.2010_CRACKLAB.rU.tgz - alfeng.com


 eXeL@B —› Вопросы новичков —› Прошу помоч разобраться с простейшей программой 2...
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати