_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
}
// далее кидаем регистры в стек... чтобы сохранить их
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
}
Владимир Симеренко
спасибо!
Похожие вопросы
- Вызов API-функции из ассемблерного кода.
- HTML! помогите пожалуйста написать код для сайта простого сайта!
- люди, помогите пожалуйста найти код от вируса
- Для чего нужен указатель this и каков его принцип работы? Объясните пожалуйста самым простым языком, как 2+2.
- Объясните пожалуйста вот этот алгоритм в Free Pascal
- Кто-нибудь может мне объяснить как писать коды в VB6.0 меня интересуют циклы do и for select case само построение
- Ребят объясните каждую строчку кода Assembler, вроде лёгко, но я туплю...
- Вопрос про С++ !Подскажите пожалуйста (не код).
- Помогите, пожалуйста, с кодом по С++. Пожалуйста, а то щас помру на сессии.
- объясните пожалуйста как работать с циклами с предусловием, с постусловием, с параметром