Я только изучаю 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
}
}
Извините за грязный код.