Загрузка данных


#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;
}