Помощь - Поиск - Пользователи - Календарь
Полная версия: Дисассемблирование команды Div
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ассемблер
LOVE133
Имеется команда div , ее необходимо продисассемблировать ( с трудом представляю что это такое ). Есть программа дисассемблера для команды mul .
code segment
assume cs: code, ds:code, ss:code
;******************************************************************************
cr equ 0dh ; символ возврата каретки
lf equ 0ah ; символ перехода на следующую строку
EndMsg equ '$' ; признак конца строки



bufd dw 0,0,0,0

Key db 0 ; Код клавиши которую нажал пользователь
msgTITLE1 db '© гр.3-41 Петров С.В. 2008г.',cr,lf,EndMsg
msgEXIT db 'Для выхода из программы нажмите любую клавишу',cr,lf,EndMsg


;******************************************************************************
adr db 0

char db 0
cursor_column db 0
cursor_line db 0

buf db 0,0,0,0


msgDB db 'metka: mul DB',cr,lf,EndMsg
msgDW db 'metka: mul DW',cr,lf,EndMsg
msgDD db 'metka: mul DD',cr,lf,EndMsg

msgAX db 'metka: mul ax',cr,lf,EndMsg
msgAH db 'metka: mul ah',cr,lf,EndMsg
msgAL db 'metka: mul al',cr,lf,EndMsg
msgEAX db 'metka: mul eax',cr,lf,EndMsg

msgBX db 'metka: mul bx',cr,lf,EndMsg
msgBH db 'metka: mul bh',cr,lf,EndMsg
msgBL db 'metka: mul bl',cr,lf,EndMsg
msgEBX db 'metka: mul ebx',cr,lf,EndMsg

msgCX db 'metka: mul cx',cr,lf,EndMsg
msgCH db 'metka: mul ch',cr,lf,EndMsg
msgCL db 'metka: mul cl',cr,lf,EndMsg
msgECX db 'metka: mul ecx',cr,lf,EndMsg

msgDX db 'metka: mul dx',cr,lf,EndMsg
msgDH db 'metka: mul dh',cr,lf,EndMsg
msgDL db 'metka: mul dl',cr,lf,EndMsg
msgEDX db 'metka: mul edx',cr,lf,EndMsg

msgDI db 'metka: mul di',cr,lf,EndMsg
msgSI db 'metka: mul si',cr,lf,EndMsg
msgBP db 'metka: mul bp',cr,lf,EndMsg
msgSP db 'metka: mul sp',cr,lf,EndMsg
msg_SI db 'metka: mul ar[si]',cr,lf,EndMsg
msg_DI db 'metka: mul ar[di]',cr,lf,EndMsg

next_cursor_column proc
;процедура сдвига курсора на одну позицию вправо
;обязательно наличие в программе процедур:;read_cursor_position, set_cursor_position
next_cursor_column proc
push ax

call read_cursor_position
inc cursor_column
call set_cursor_position

pop ax
ret
next_cursor_column endp


;***Процедура позиционирования курсора*****************************************
set_cursor_position proc
;входные параметры
;db cursor_line - строка
;db cursor_column - колонка
push ax
push dx

mov ah,02h
mov dh,cursor_line
mov dl,cursor_column
int 10h

pop dx
pop ax
ret
set_cursor_position endp



;***Процедура определения текущей позиции курсора******************************
read_cursor_position proc
;выходные данные
;db cursor_line - строка
;db cursor_column - колонка
push ax
push bx
push dx

mov ah,03h
mov bh,00h
int 10h

mov cursor_line,dh
mov cursor_column,dl

pop dx
pop bx
pop ax
ret
read_cursor_position endp


;***Процедура вывода символа с учетом цвета************************************
print_char proc
;входные параметры
;char - выводимый символ
push ax
push dx

mov al,char ;чрэюёшь т al ЎшЇЁє
mov ah,09h ;эюьхЁ яЁюЎхфєЁ√ BIOS
mov bl,0Fh ;т√сюЁ ЎтхЄр
mov cx,01h ;ъюышўхёЄтю яютЄюЁхэшщ
int 10h ;т√чют яЁюЎхфєЁ√ BIOS

pop dx
pop ax
ret
print_char endp



;------------------------------------------------------------------------

;-----------------------------------------------------------------------


; ***Процедура очистки экрана**************************************************
CLRSCR proc

push bp
mov bp,sp
push ax
push bx
push cx
push dx
xor cx,cx ; ъююЁфшэрЄ√ ыхтюую тхЁїэхую єуыр CH-y,CL-x
mov dx,184FH ; ъююЁфшэрЄ√ яЁртюую эшцэхую єуыр DH-y,DL-x
; mov dh,24
; mov dl,79
mov al,0 ;ъюышўхёЄтю ёфтшурхь√ї ёЄЁюъ, хёыш 0, Єю тхё№ ¤ъЁрэ
mov ah,06H ; эюьхЁ яюфЇєэъЎшш - юўшёЄър юъэр
mov bh,7 ;рЄЁшсєЄ ЎтхЄр (ўхЁэю-схы√щ)

int 10h ;т√чют ЇєэъЎшш
pop dx
pop cx
pop bx
pop ax
pop bp
ret ;тючтЁрЄ т юёэютэє■ яЁюуЁрььє
fldz


CLRSCR endp
; *****************************************************************************

; *****************************************************************************
ReadKey proc
mov ah,1
int 21h
mov Key,al

ret
ReadKey endp
; *****************************************************************************


; *****************************************************************************
Print proc far ; т√тюфшЄ ёююс∙хэшх эр ¤ъЁрэ
; шьх рфЁхё ёЄЁюъш т ds:dx
; lea dx, ...

mov ah,09h ;ЇєэъЎш т√тюфр
int 21h ; яЁюуЁрььэюх яЁхЁ√трэшх
ret

Print endp
; *****************************************************************************


; ***Выход из пограммы********************************************************
quit proc
lea dx, msgEXIT
call Print

call Readkey
; cmp Key,27 ;ёЁртэштрхь эрцрЄшх esc ш єёЄрэртыштрхь Їыруш
; je Exit ; ╧хЁхїюф хёыш Key = 27
; jmp NoExit ; ╚эрўх
Exit:
mov ax,4c00h ;т√їюф т ─╬╤
int 21h
ret
quit endp
; *****************************************************************************

;***Перевод строки*************************************************************
crcf proc
xor bh,bh
mov ah,3
int 10h
xor dl,dl
inc dh
mov ah,02
int 10h
ret
crcf endp
;******************************************************************************





; ***ОСНОВНАЯ ПРОГРАММА********************************************************
Program proc
NoExit:

push ss

pop ds


finit; приведение сопроцессора в начальное состояние
call ClrScr
mov cursor_line , 2
mov cursor_column , 2
call set_cursor_position

lea dx,msgTITLE1
call print

metka : mul buf[di]


mov cx, 4
lea si, metka
xor di, di
c1:
mov al, [si]
mov buf[di], al

inc si
inc di
loop c1

;==============================================================================
;СРАВНИВАЕМ ПЕРВЫЕ СИМВОЛЫ
;==============================================================================
l1 : cmp buf[0], 247
jne l2


;==============================================================================
;СРАВНИВАЕМ ВТОРЫЕ СИМВОЛЫ
;==============================================================================
l_f7 : cmp buf[1], 38 ; 26
je l_f7_26
cmp buf[1], 224; ax
je l_ax
cmp buf[1], 227; bx
je l_bx
cmp buf[1], 225; cx
je l_cx
cmp buf[1], 226; dx
je l_dx
cmp buf[1], 229; bp
je l_bp
cmp buf[1], 228; sp
je l_sp
cmp buf[1], 230; si
je l_si
cmp buf[1], 231; di
je l_di
jmp l_exit

l_f7_26:lea dx,msgDW
jmp l_exit
l_ax :lea dx,msgAX
jmp l_exit
l_bx :lea dx,msgBX
jmp l_exit
l_cx :lea dx,msgCX
jmp l_exit
l_dx :lea dx,msgDX
jmp l_exit
l_bp :lea dx,msgBP
jmp l_exit
l_sp :lea dx,msgSP
jmp l_exit
l_si :lea dx,msgSI
jmp l_exit
l_di :lea dx,msgDI
jmp l_exit

l2 :
cmp buf[0], 102
jne l3


l_66 : cmp buf[1], 247 ; f7
je l_66_f7

cmp buf[1], 38 ; f7
je l_66_26

jmp l_exit
l_66_f7:
cmp buf[1], 38 ; 26
je l_66_26
cmp buf[1], 224; ax
je l_eax
cmp buf[1], 227; bx
je l_ebx
cmp buf[1], 225; cx
je l_ecx
cmp buf[1], 226; dx
je l_edx

jmp l_exit


l_66_26:
lea dx,msgDD
jmp l_exit
l_eax :lea dx,msgEAX
jmp l_exit
l_ebx :lea dx,msgEBX
jmp l_exit
l_ecx :lea dx,msgECX
jmp l_exit
l_edx :lea dx,msgEDX

jmp l_exit

l3 :cmp buf[0], 246
je l_f6
jmp l_exit

l_f6 : cmp buf[1], 38 ; 26
je l_f6_26
cmp buf[1], 224; al
je l_al
cmp buf[1], 227; bl
je l_bl
cmp buf[1], 225; cl
je l_cl
cmp buf[1], 226; dl
je l_dl

cmp buf[1], 228; ah
je l_ah
cmp buf[1], 231; bh
je l_bh
cmp buf[1], 229; ch
je l_ch
cmp buf[1], 230; dh
je l_dh

cmp buf[1], 164; _si
je l_asi
cmp buf[1], 165; _di
je l_adi

jmp l_exit




l_f6_26:lea dx,msgDB
jmp l_exit
l_al :lea dx,msgAL
jmp l_exit
l_bl :lea dx,msgBL
jmp l_exit
l_cl :lea dx,msgCL
jmp l_exit
l_dl :lea dx,msgDL
jmp l_exit
l_ah :lea dx,msgAH
jmp l_exit
l_bh :lea dx,msgBH
jmp l_exit
l_ch :lea dx,msgCH
jmp l_exit
l_dh :lea dx,msgDH
jmp l_exit
l_asi :lea dx,msg_SI
jmp l_exit
l_adi :lea dx,msg_DI
jmp l_exit
;==============================================================================
;СРАВНИВАЕМ ТРЕТИЙ СИМВОЛЫ
;==============================================================================





l_exit:





lexit:
call print
call crcf
call quit
Program endp
code ends
end Program



Суть этой программки в том что смотрится дамп, оттуда выдираются значения для известных регистров с этой командоф (mul) как-то mul ah, mul al и т.д , производятся кучи сравнеий и в итоге выходим на то что записанная команда ( под лейблом metka) есть то что там записано на самом деле...Непонятно объясняю потому что с трeдом себе все это представляю.Как мне переделать это чудо для команды div ? ...
andriano
Я тоже ничего не понял из твоего объяснения, но как mul, так и div входят в систему команд x86, так что их "дизассемблирование" приведет к единственной строке на языке Ассемблера, в которой эта команда и будет записана. В реальном лстинге наверняка попадутся и вспомогательные команды - для загрузки и сохранения операндов.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.