#include "stdafx.h"
#include <cstdlib>
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
// X, Y — знаковые байты в диапазоне [-128; 127]
// Условие: (|X| - |Y|) mod 4 == 0
short x = 0; // текущее X
short y = 0; // текущее Y
long count = 0; // счётчик подходящих пар
__asm {
mov word ptr count, 0
mov word ptr count + 2, 0
mov x, -128 ; X = -128
outer_loop:
mov y, -128 ; Y = -128
inner_loop:
; ---- |X| ----
mov ax, x
test ax, ax
jns abs_x_ok
neg ax
abs_x_ok:
mov bx, ax ; BX = |X|
; ---- |Y| ----
mov ax, y
test ax, ax
jns abs_y_ok
neg ax
abs_y_ok:
; ---- (|X| - |Y|) mod 4 ----
sub bx, ax ; BX = |X| - |Y|
and bx, 3 ; младшие 2 бита = остаток по модулю 4
jnz skip ; не делится на 4 -> пропустить
inc word ptr count ; count++
jnc skip ; переноса нет -> готово
inc word ptr count + 2 ; перенос в старшее слово
skip:
inc y
cmp y, 127
jle inner_loop
inc x
cmp x, 127
jle outer_loop
}
cout << "count = " << dec << count << endl;
system("pause");
return 0;
}
#include "stdafx.h"
#include <cstdlib>
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
short x = 0;
short y = 0;
long count = 0; // сколько пар уже найдено
short found_x = 0; // X найденной пары
short found_y = 0; // Y найденной пары
short found = 0; // флаг: 1 — пара найдена
__asm {
mov word ptr count, 0
mov word ptr count + 2, 0
mov found, 0
mov x, -128
outer_loop:
mov y, -128
inner_loop:
; ---- |X| ----
mov ax, x
test ax, ax
jns abs_x_ok
neg ax
abs_x_ok:
mov bx, ax
; ---- |Y| ----
mov ax, y
test ax, ax
jns abs_y_ok
neg ax
abs_y_ok:
sub bx, ax
and bx, 3
jnz skip
; ---- нашли подходящую пару ----
inc word ptr count
jnc no_carry
inc word ptr count + 2
no_carry:
; count == 200 ?
cmp word ptr count, 200
jne skip
cmp word ptr count + 2, 0
jne skip
; ---- запоминаем 200-ю пару ----
mov ax, x
mov found_x, ax
mov ax, y
mov found_y, ax
mov found, 1
jmp done
skip:
inc y
cmp y, 127
jle inner_loop
inc x
cmp x, 127
jle outer_loop
done:
nop
}
if (found)
cout << "200th pair: X = " << dec << found_x
<< ", Y = " << found_y << endl;
else
cout << "Less than 200 pairs found" << endl;
system("pause");
return 0;
}