Другие языки программирования и технологии

Объясните, пожалуйста, ассемблерный код

_asm {
push eax
push ebx
push ecx
push edx
push esi
push edi
push cx

mov eax, str
mov ecx, [strLength]

mov esi, eax
add eax, ecx
mov edi, eax
lea eax, binStr

for_loop:

cmp esi, edi
je exit_loop
mov dl, [esi]
mov bx, 0

toBin:
cmp bx, 8
je exit_loop2
mov cl, 0
rcr dl, 1
adc cl, 0
mov edx, index
movzx ecx, cl
inc bx
inc index
jmp toBin
exit_loop2:
inc esi

jmp for_loop
exit_loop:

pop cx
pop edi
pop esi
pop edx
pop ecx
pop ebx
pop eax
}

P.S. Функция кода - преобразовать строку с десятичным числом в строку с двоичным числом
_asm { // ассемблерный код где-то в си
// далее кидаем регистры в стек... чтобы сохранить их
push eax
push ebx
push ecx
push edx
push esi
push edi
push cx // интересно нах это делать, когда и так ecx уже сохранен

mov eax, str // грузим адрес переменной str, предполагают, что там строка с десятичным числоам
mov ecx, [strLength] // грузим значение переменной strLength - предполагаю длина строки str

mov esi, eax // тут будет уже адрес строки... а надо, чтобы si регистры использовать как надо
add eax, ecx // + длину, так что будет указывать на конец
mov edi, eax // адрес конец строка
lea eax, binStr // взять адрес строки где видно будет двоичный вид

for_loop: // метка цикла

cmp esi, edi // сравним что конец ли
je exit_loop // прыгаем на выход если равно
mov dl, [esi] // берем байт по адресу
mov bx, 0 // обнуляем bx

toBin: // ну видно тут в бинарный вид преобразует лень разбирать, сам пойми
cmp bx, 8
je exit_loop2
mov cl, 0
rcr dl, 1
adc cl, 0
mov edx, index
movzx ecx, cl
inc bx
inc index
jmp toBin
exit_loop2:
inc esi

jmp for_loop // переход на начало цикла
exit_loop: // метка конца

// из стека восстановим засранные наши регистры
pop cx
pop edi
pop esi
pop edx
pop ecx
pop ebx
pop eax
}
Владимир Погодин
Владимир Погодин
93 860
Лучший ответ