Объясните принцип работы
Изучаю ассемблер. Не понимаю, как выполняется код. Объясните пожалуйста, что происходит, начиная с _start и заканчивая loop add_loop. Я не понимаю принципа работы.
section .text
global _start
_start:
mov esi, 4
mov ecx, 5
clc
add_loop:
mov al, [num1 + esi]
adc al, [num2 + esi]
aaa
pushf
or al, 30h
popf
mov [sum + esi], al
dec esi
loop add_loop
mov edx,len
mov ecx,msg
mov ebx,1
mov eax,4
int 0x80
mov edx,5
mov ecx,sum
mov ebx,1
mov eax,4
int 0x80
mov eax,1
int 0x80
section .data
msg db 'The Sum is:',0xa
len equ $ - msg
num1 db '12345'
num2 db '23456'
sum db ' '
Ответы (1 шт):
Автор решения: Axifive
→ Ссылка
Вот, добавил комментарии к командам:
_start:
mov esi, 4 ; инициализация рабочего разряда в числах (единицы)
mov ecx, 5 ; инициализация переменной цикла
clc ; сброс флага переноса CF
add_loop:
mov al, [num1 + esi] ; записываем цифру из выбранного разряда
adc al, [num2 + esi] ; сложение двух цифр c добавлением значения флага переноса CF
aaa ; увеличение значение регистра AH на 1
pushf ; записать в стек регистр FLAGS
or al, 30h ; получение значения ASCII
popf ; возвращаем значения регистра FLAGS из стека
mov [sum + esi], al ; записываем значения ASCII в разряд результата
dec esi ; декремент разряда числа
loop add_loop ; декрементим CX и возвращаемся к началу цикла
Та же логика на С:
int main() {
char first[] = "12345";
char second[] = "23456";
char result[] = " ";
char sum;
char flag = 0;
for (int i = 4; i >= 0; i--) {
sum = first[i] + second[i] - 0x30 + flag;
if (sum > '9') {
sum = sum - 0xA;
flag = 1;
} else {
flag = 0;
}
result[i] = sum;
}
printf("%s\n", result);
return 0;
}