Поменять числа местами - Assembler
Формулировка задачи:
Здравствуйте, суть программы состоит в том, что вводятся 2 числа(byte) и нужно 4 различными способами поменять их местами.
В LabeledEdit1 вводится первое число, В LabeledEdit2 вводится второе число, BitBtn для использования нужного способа, интерефейс пока не отладил должным способом, прошу не придираться.
В данный момент написал только 2 работающих способа, 3й(через stack)способ через не могу отладить, до 4го пока не додумался, может кто-нибудь дать наводку как можно поменять 4ым(не через дополнительную переменную) способом?
Используется встроенный asm на Delphi.
Так же если у Вас имеются предложения по оптимизации готовых способов - готов выслушать.
procedure TForm1.BitBtn1Click(Sender: TObject);
var
a,b:byte;
begin
a:=strtoint(form1.LabeledEdit1.text);
b:=strtoint(form1.LabeledEdit2.text);
asm
mov al,a
mov bl,b
xchg al,bl
mov a,al
mov b,bl
end;
form1.LabeledEdit1.text:=inttostr(a);
form1.LabeledEdit2.text:=inttostr(b);
end;
procedure TForm1.BitBtn2Click(Sender: TObject);
var
a,b:byte;
begin
a:=strtoint(form1.LabeledEdit1.text);
b:=strtoint(form1.LabeledEdit2.text);
asm
mov al,a
mov bl,b
add al,bl
sub bl,al
neg bl
sub al,bl
mov a,al
mov b,bl
end;
form1.LabeledEdit1.text:=inttostr(a);
form1.LabeledEdit2.text:=inttostr(b);
end;
procedure TForm1.BitBtn3Click(Sender: TObject);
var
a,b:byte;
begin
a:=strtoint(form1.LabeledEdit1.text);
b:=strtoint(form1.LabeledEdit2.text);
asm
pushad
mov al,a
mov bl,b
push al
push bl
pop al
pop bl
mov a,al
mov b,bl
popad
end;
form1.LabeledEdit1.text:=inttostr(a);
form1.LabeledEdit2.text:=inttostr(b);
end;Решение задачи: «Поменять числа местами»
textual
Листинг программы
mov al,a lea bx,b xchg al,[bx] mov a,al
Объяснение кода листинга программы
- Создается переменная
aсо значением, которое нужно поменять местами с другой переменной. - Создается переменная
b, которая указывает на адрес, где находится значение, с которым нужно поменятьaместами. - Происходит обмен значений между регистром
alи значением, на которое указываетbx. То есть, значение переменнойaсохраняется в регистреal, а значение из ячейки памяти, на которую указываетbx, записывается в переменнуюa. - Значение из регистра
al(которое до обмена было в переменнойa) записывается обратно в переменнуюa. Теперь значения переменных поменялись местами.