Сдвиг числа в ассемблере командой RCR

251
18 декабря 2017, 14:52

Задание: Реализовать в С++ функцию void BigRorCount(byte* M1, short len, short count), где M1 – сверхбольшое целое положительное число (байтовый массив длиною len), count – количество разрядов сдвига. Операция – циклический сдвиг вправо (в сторону младших разрядов) на количество двоичных разрядов, заданное параметром count. При этом count младших разрядов уступают на место старших разрядов . Нужно использовать команды для 32-разрядных данных. Если значения len не кратно 4, то при необходимости для последних байт использовать команды для 8-разрядных данных.

Суть проблемы: не переносит последний бит на перед

Source.cpp:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define n 8 // количество байтов у сверхбольшому числе
typedef unsigned char byte; 
extern "C" void BigRorCount(byte* M1, short len, short count);
void PrintBinary(byte *number, short length)
{
    for (short i = length; i != 0; --i)
    {
        byte currentPart = *(number + i - 1);
        currentPart & 0x80 ? printf("1") : printf("0");
        currentPart & 0x40 ? printf("1") : printf("0");
        currentPart & 0x20 ? printf("1") : printf("0");
        currentPart & 0x10 ? printf("1") : printf("0");
        currentPart & 0x08 ? printf("1") : printf("0");
        currentPart & 0x04 ? printf("1") : printf("0");
        currentPart & 0x02 ? printf("1") : printf("0");
        currentPart & 0x01 ? printf("1") : printf("0");
        printf(" ");
    }
    printf("\n\n");
}
int main()
{
    srand(time(NULL));
    byte x[n];//сверхбольшое число
    for (int i = 0; i<n; i++)
    {
        x[i] = rand() % 255;
    }
    printf("Before: \n\n");
    printf("M1 = \n");
    PrintBinary(x, n);
    BigRorCount(x, n, 1);
    printf("New M1 = \n");
    PrintBinary(x, n);
    system("pause");
    return 0;
}`

AsmSource.asm:

    .386
    .model flat, C
    .code
    BigRorCount proc
    push ebp
        mov ebp, esp;
        mov edi, [ebp + 8]  ;m1
        mov ebx, [ebp + 12] ;length
        mov esi, [ebp + 14] ; count
        cmp dl, 0
        je false
        true: 
        mov al, 1
        jmp cont
        false:
        mov al, 0
        cont:
        mov ecx, 0
        clc 
        pushf

        _loop:
        cmp ecx, ebx
        jge finish
        popf
        rcr byte ptr[edi+ecx], 1
        pushf
        inc ecx
        jmp _loop

 ;;;;;;;;;;;
         pushf
        rcl byte ptr[edi+0], 1
        popf
        rcr byte ptr[edi+0], 1
 ;;;;;;;;;;;
; _while:
;   cmp eax, esi
;   jge finish
;   mov ecx,0
;       _loop:
;           cmp ecx, ebx
;           jge label1
;            popf
;            rcr byte ptr[edi+ecx],1
;            pushf
;            inc ecx
;            jmp _loop
; label1:
; inc eax
; jmp _while
; попытка реализации сдвига через двойной цикл
    finish:
    popf
    pop ebp
    ret
BigRorCount endp
end
READ ALSO
Работа большими числами

Работа большими числами

Подскажите, пожалуйста как работать с большими числами, такие как, 10^90(можно и меньше) uint64_t не помогает

250
вспомогательный класс auto_ptr_ref

вспомогательный класс auto_ptr_ref

Для чего нужен был вспомогательный класс auto_ptr_refНужны примеры простейшей реализации и использования

172
Реализация алгоритма Полига — Хеллмана

Реализация алгоритма Полига — Хеллмана

Алгоритм Полига — Хеллмана

353