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

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


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

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Assembler (Ассемблер)

Выпуск № 499
от 23.07.2006, 19:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 334, Экспертов: 25
В номере:Вопросов: 2, Ответов: 4


Вопрос № 49443: Здравствуйте. У меня один глупый вопрос. Как мне узнать содержимое регистров. Например, если я знаю что в ax- 0bah . Как мне вывести это число на экран ?...
Вопрос № 49449: Научился немного работать с дизассемблерами и отладчиками. Есть любой софт: IDA, SoftIce, WDasm и другие Брейкпойнты ставить могу, немного ковыряюсь в кодах программ. Вопрос: в каком редакторе можно изменить код программы (например, п...

Вопрос № 49.443
Здравствуйте. У меня один глупый вопрос. Как мне узнать содержимое регистров. Например, если я знаю что в ax- 0bah . Как мне вывести это число на экран ?
Отправлен: 18.07.2006, 09:52
Вопрос задал: Whitemen (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: newinfo2005
Здравствуйте, Whitemen!
Пробуй это.
выводит числа находящиеся в ax

Приложение:

---------
"Спасибо" - нет такой валюты.

Ответ отправил: newinfo2005 (статус: 7-ой класс)
Ответ отправлен: 18.07.2006, 13:08
Оценка за ответ: 4
Комментарий оценки:
Должно быть это работает, но только не у меня.
Выскакивает несколько ошибок.
1.По поводу endm:
can't use this outside macro.
2.movzx:
illegal instruction for currently selected processor.
Unexpected end of file encountered.
Не представляю как все это исправить. Но все равно спасибо за ответ. Не ожидал, что для того чтобы вывести четыре цифры нужно столько париться.

Отвечает: Triada
Здравствуйте, Whitemen!

могу предложить общий вариант решения данной задачи

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

макрос можно положить в отдельный модуль и подключать в основной программе
командой include USERV.MAC
для этого два ниже приведенных макроса сохраните в отдельном файле
1. перевод строки в число
2. вывод числа

перввый
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
U_BIN2STR MACRO STRING_NAME
local fill_buf,clr_dvd,no_more
;;*****************************************************************
;; Вызов: U_BIN2STR {имя-сроки}
;; имя-сроки db 7 dup(?)
;; Преобразует двоичное число со знаком, находящееся в AX, в изо-
;; бражение целого десятичного со знаком. Результат размещатся в
;; сегменте данных (DS:string_name) в виде ASCII-строки, первый
;; байт которой - счетчик, содержащий двоичное 6, а остальные шесть
;; байт - знак и цифры.
;; Если имя-строки не задано, результат размещ. по адресу DS:BX
;; Все регистры сохраняются.
;;
;; Прототип: Leo J.Scanlon. IBM PC & XT. Assembly Language...
;; (c) Воспроизведение, изменение, оформление: USeAn-1995: 280195
;;*****************************************************************

;; Пролог:
push dx ;; -Сохранение регистров
push cx
push bx
push si
push ax

;;Основная логика:
ifnb <string_name>
lea bx,string_name ;;-Адрес 1-го символа в вых.строке
endif
mov byte ptr [bx],6 ;; -Зафиксировать счетчик символов.
inc bx
mov cx,6 ;;-Опробеливание вых.стр.
fill_buf:
mov byte ptr [bx],' '
inc bx
loop fill_buf
mov si,10 ;;-Приготовиться к делению на 10.
or ax,ax ;;-Если значение отрицательное,
jns clr_dvd ;; то изменить его знак.
neg ax
clr_dvd:
sub dx,dx ;;-Обнулить старшую половину делимого.
div si ;;-Поделить AX на 10.
add dx,'0' ;;-Преобразовать остаток в ASCI-цифру.
dec bx ;;-Попятиться в буфере.
mov [bx],dl ;;-Поместить в вых. строку.
or ax,ax ;;-Все сделано ?
jnz clr_dvd ;; -Нет. Взять следующую цифру.
pop ax ;; -Да. Взять исходное число.
or ax,ax ;; -Оно отрицательное?
jns no_more ;; -Нет. Заканчивать.
dec bx ;; -Да. Поместить знак в вых. стр.
mov byte ptr [bx],'-'
no_more:
;;Эпилог. Восстановление регистров:
pop si
pop bx
pop cx
pop dx

endm

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

второй
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
U_SHOW_BIN MACRO COMMENT
local string,comm,begin
;;*****************************************************************
;; Вызов: U_SHOW_BIN {'комментарий'}
;; Преобразует двоичное число со знаком, находящееся в AX, в изо-
;; бражение целого десятичного со знаком. Результат размещатся на
;; экране в позиции курсора: комментарий число
;; Все регистры сохраняются.
;; Использует: Int 21h/Fn 09h; макро U_BIN2STR
;; (c) USeAn-1995: 100295
;;*****************************************************************

;; Пролог:
pushf
push ds ;; -Сохранение регистров
push ax
push bx
push dx
mov bx,cs ;; -Установка ds на локальные данные
mov ds,bx ;; в кодовом сегменте
jmp begin ;; -Обход локальных данных

;;Локальные данные:
ifb <comment>
comm equ string
else
comm db comment
endif
string db 7 dup(?)
db '$'
;;Основная логика:
begin:
u_bin2str string ;; результат в памяти
mov string,' '
mov dx,offset comm
mov ah,09h ;; вывод на экран
int 21h

;;Эпилог (восстановление регистров):
pop dx
pop bx
pop ax
pop ds
popf
endm
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

теперь в основной программе
в первой строчке пишем
include USERV.MAC
------------------------
в том месте где нужно вывести пишем (макрос выводит на экран то что лежит в ах)
u_show_bin<13,10,'rezult='> ;13,10 это первод строки, rezult= - это комментарий может быть любым
------------------------

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

mov ax,5
u_show_bin<13,10,'otvet='>
---------------------------------
общий вид для макроса
U_SHOW_BIN - ПОКАЗАТЬ ЧИСЛО

Вызов: U_SHOW_BIN {'комментарий'}

Преобразует двоичное число со знаком, находящееся в AX, в изображение целого десятичного со знаком. Результат размещатся на экране в позиции курсора: комментарий число

Все регистры сохраняются.Использует: Int 21h/Fn 09h; макро U_BIN2STR
Ответ отправила: Triada (статус: 1-ый класс)
Ответ отправлен: 18.07.2006, 14:06
Оценка за ответ: 4
Комментарий оценки:
Спасибо конечно, но я нихрена не понял. Пойду подучу асму.

Отвечает: Волков Павел Юрьевич
Здравствуйте, Whitemen!
Вопрос не глупый, все с этим сталкиваются. Можно делить содержимое на десять(необходимая система счисления), переводить в ascii код и помещать в буфер для вывода. Существуют более оптимальные методы, чем простое деление, т.к. инструкция div медленная. Для чисел до 99(hex:0x63): mov esi,offset buffer ;поместим в esi смещение строки "buffer" mov al,63h ;вывод содержимого регистра al. если его размер не более 99 aam ;преобразование одной инструкцией, делит содержимое al на 10, помещая частное в ah, остаток в al, в результате ax=0909 or ax,3030 ;преобразуем в ascii stosw ;помещаем ax в строку buffer Вывод eax (самый медленный способ): mov esi, offset buffer mov ecx,0 ;счетчик цифр label: mov eax,0FFFFFFFFh ;максимальное беззнаковое mov ebx,0Ah ;система счисления mov edx,0 div ebx ; eax=19999999 - частное, edx=5 - остаток push edx inc ecx test eax,eax je label2 jmp label1 label2: pop eax or al,30h stosb dec ecx jcxz exit jmp label2 exit: push 0 push offset buffer push of fset buffer push 0 call MessageBoxA
---------
Век живи, век учись.
Ответ отправил: Волков Павел Юрьевич (статус: 2-ой класс)
Ответ отправлен: 18.07.2006, 19:47
Оценка за ответ: 4


Вопрос № 49.449
Научился немного работать с дизассемблерами и отладчиками.
Есть любой софт: IDA, SoftIce, WDasm и другие
Брейкпойнты ставить могу, немного ковыряюсь в кодах программ.
Вопрос: в каком редакторе можно изменить код программы
(например, поменять переходы или поставить nop)?
Можно это сделать непосредственно в IDA или других отладчиках?
Отправлен: 18.07.2006, 10:28
Вопрос задал: Belomor (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Волков Павел Юрьевич
Здравствуйте, Belomor!
Редакторы для работы с файлами в кодах называют hex-редакторами, например Hiew (webhost.kemtel.ru/~sen/indexr.html), WinHex (www.winhex.com). Пользуюсь отладчиком Ollydbg (ollydbg.win32asmcommunity.net или home.t-online.de/home/Ollydbg/viewer.htm ), в нем можно изменить код и сохранить в отдельно.

---------
Век живи, век учись.
Ответ отправил: Волков Павел Юрьевич (статус: 2-ой класс)
Ответ отправлен: 18.07.2006, 18:46
Оценка за ответ: 4


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.34 от 01.06.2006
Яндекс Rambler's Top100

В избранное