Попытка PU SH значения в ASM внутри функции, что я делаю неправильно? - PullRequest
0 голосов
/ 30 января 2020

Я только изучаю ASM и кодирую в Visual Studio (я включаю ASM в код C ++). Проблема, которую я пытаюсь решить: у меня есть номер. Я должен преобразовать его в базу 4, а затем преобразовать его в массив символов. Мне удалось преобразовать его, но в обратном направлении (если число равно 1332 (4), я получаю 2331 (4) в массиве символов), и теперь я хотел обратить его. Я застрял, когда я пытаюсь PU SH значение внутри функции. Когда я пытаюсь получить к нему доступ (CMP EDI, [EBP + 16]), я не получаю правильное значение. Это код.

#include <iostream>
using namespace std;

void conv(unsigned n, char* s);
int zero = 0;
int unu = 1;
int doi = 2;
char s[25];
int po = 48;

int main()
{
    unsigned n = 126;
    _asm
    {
        LEA ECX, s
        PUSH ECX
        PUSH n
        CALL conv
        ADD ESP, 8
    }
    for (int i = 0; i < 6; i++)
        cout << s[i] << " ";
}

void conv(unsigned n, char* s)
{
    _asm {
        MOV EBX, [EBP + 12]
        MOV ECX, [EBP + 8]
        MOV EDI, zero
        //fac sirul invers
        lopp :
            CMP ECX, zero
            JBE endd
            SHR ECX, 1
            MOV EDX, zero
            JC gasit1
            JMP nextt
            gasit1 :
             ADD EDX, unu
            nextt :
            SHR ECX, 1
            JC gasit12
            ADD EDX, zero
            JMP next2
            gasit12 :
            ADD EDX, doi
            next2 :
            ADD EDX, po
            MOV [EBX + EDI], EDX
            MOV EDX, 0
            INC EDI
            JMP lopp
            endd:
                DEC EDI
                MOV ESI, EDI
                MOV eax, edi
                div doi
                PUSH EAX
                revertt:
                    CMP EDI, [EBP + 16]
                    JBE finall
                    MOV AH, byte ptr [EBX + EDI]
                    MOV EDX, ESI
                    SUB EDX, EDI
                    MOV CH , byte ptr [EBX + EDX]
                    PUSH ECX
                    MOV [EBX + EDX], AH
                    POP ECX
                    MOV [EBX + EDI], CH
                    DEC EDI
                JMP revertt
                finall:
                    ADD ESP, 4
    }
}

Извините за грязный код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...