Помогите разобраться в программке..

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Ответить
Chena
Сообщения: 1
Зарегистрирован: 25 апр 2011, 17:10

Ребята! Помогите плиз разобраться, что выполняет фрагмент программы:
var_28 =byte ptr -28h
var_18 =byte ptr -18h
var_E =byte ptr -0Eh
var_D =byte ptr -0Dh
var_4 =byte ptr -4
var_2 =byte ptr -2
push si
push di
lea ax, [bp+var_28]
push ss
push ax
push ds
push offset unk_16978
mov cx, 10h
call N_SCOPY@
xor dx, dx
jmp short loc_102B5

loc_102AC:
lea bx, [bp+var_18]
add bx, dx
mov byte ptr [bx], 0
inc dx

loc_102B5:
cmp dx, 0Ah
jl short loc_102AC
mov [bp+var_2], 0Ah
jmp short loc_102D4

loc_102C1:
mov bx, 0Ah
sub bx, [bp+var_2]
lea ax, [bp+var_E]
add bx, ax
mov al, byte ptr [bp+var_2]
mov [bx], al
dec [bp+var_2]

loc_102D4:
cmp [bp+var_2], 0
jge short loc_102C1
mov [bp+var_2], 3
xor si, si
jmp short loc_10328

loc_102E3:
mov al, [bp+si+var_E]
cbw
mov dx, ax
mov cl, byte ptr[bp+var_2]
shl dx, cl
and dx, 0FFh
mov al, [bp+si+var_D]
cbw
mov [bp+var_4], ax
xor di, di
jmp short loc_1031F

loc_102FD:
mov bx, di
add bx, bx
lea ax, [bp+var_28]
add bx, ax
mov ax, [bp+var_4]
test [bx], ax
jz short loc_1031E
mov bx, 8
sub bx, [bp+var_2]
add bx, di
add bx, bx
lea ax, [bp+var_28]
add bx, ax
or dx, [bx]

loc_1031E:

inc di
loc_1031F:
cmp di, [bp+var_2]
jl short loc_102FD
mov [bp+si+var_18], dl
inc si

loc_10328:
cmp si, 0Ah
jl short loc_102E3
pop di
pop si
return 0
N_SCOPY@ proc near
arg_0 = dword ptr 4
arg_4 = dword ptr 8
push bp
mov bp,sp
push si
push di
push ds
lds si, [bp+arg_0]
les di, [bp+arg_4]
cld
shr cx, 1
rep movsw
adc cx,cx
rep mowsb
pop ds
pop di
pop si
pop bp
return 8
N_SCOPY@ endp


Особенно интересует инициализация: почему указатели минусовые? Пожалуйста помогите девушке... :confused:
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Такое впечатление, что это текст какой-то процедуры, а указатели "отрицательные", потому что там хранятся значения параметров этой процедуры.
Например, в Паскале соглашение, что вызывающая процедуру программа параметры записывает в стек. А процедура на старте помещает в регистр bp текущее значение указателя стека (sp). Таким образом, все параметры оказываются относительно bp с отрицательным смещением. А обращение к ним идет именно по ссылке [bp - <смещение>].

Смучает, правда, то, что эти отрицательные смещения довольно большие (28h), а в конце процедура просит освободить из стека лишь 8 дополнительных байт (см. оператор "return 8")
BulldozerBSG
Сообщения: 270
Зарегистрирован: 09 янв 2010, 04:14
Контактная информация:

Листинг очень похож на тот который генерит IDA.
BulldozerBSG
Сообщения: 270
Зарегистрирован: 09 янв 2010, 04:14
Контактная информация:

По отрицательному смещению стека обычно хранят локальные переменные, а по положительному лежат аргументы для функции.

а с оператором "return 8" все в порядке, т.к. начало функции с которой он связан находится 16 строками выше от него.
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

BulldozerBSG писал(а):По отрицательному смещению стека обычно хранят локальные переменные, а по положительному лежат аргументы для функции.
Согласен. Виноват. Это у меня в сознании все инвертировалось :)

В таком случае, в самом деле, все в порядке. Из оператора "return 8" понимаем, что параметров в ф-ию передано на 8 байт. И в листинге присутствуют строки:

arg_0 = dword ptr 4
arg_4 = dword ptr 8
.....................
lds si, [bp+arg_0]
les di, [bp+arg_4]

Т.е. даже с увереностью (по операторам lds) можно скадать, что передаваемые в ф-ию 8 байт параметров - это два указателя.
BulldozerBSG
Сообщения: 270
Зарегистрирован: 09 янв 2010, 04:14
Контактная информация:

BBB писал(а):что передаваемые в ф-ию 8 байт параметров - это два указателя
Судя по коду архитектура 16 битная, а в ней указатели 2 байтные. Вот и получается что в функцию передано 4 параметра. А где используются еще 2 параметра непонятно, но скорее всего в объявлении функции эти параметры были, а телу функции они не нужны.
Есть еще второй вариант: если использовались int32 в качестве параметров функции.
Ответить