Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- char* addTwoStringNumbers(char *num1, int posNum1, char *num2, int posNum2)
- {
- int posNum3 = 1+(posNum1>=posNum2?posNum1:posNum2);
- char *resNum = new char[posNum3];
- resNum[posNum3] = '\0';
- __asm
- {
- push esi;
- push edi;
- push eax;
- push ebx;
- push ecx;
- push edx;
- // START CODING HERE
- MOV EDI, posNum3; // posNum3
- MOV BH, byte ptr[num1]; // *num1
- MOV BL, byte ptr[num2]; // *num2
- MOV ECX, 0; // carry = 0
- MOV DH, byte ptr[resNum]; // *resNum
- MOV DL, 0; // currNum3 = 0
- WHILE:
- MOV AH, 0; // currNum1 = 0
- MOV AL, 0; // currNum2 = 0
- MOV ESI, posNum1;
- PUSH ESI;
- CMP ESI, 0; // if posNum1 > 0
- JG IF_1;
- MOV ESI, posNum2; // dont need posNum1 if it didnt jump
- CMP ESI, 0; // if posNum2 > 0
- JG IF_2;
- IF_1:
- DEC ESI; // posNum1--
- MOV AH, byte ptr[BH+ESI]; // currNum1 = num1[posNum1] - '0';
- SUB AH, '0';
- JMP CONT_WHILE;
- IF_2:
- DEC ESI; // posNum2--
- MOV AL, byte ptr[BL+ESI]; // currNum2 = num2[posNum2] - '0';
- SUB AL, '0';
- JMP CONT_WHILE;
- CONT_WHILE:
- ADD AH, AL; // currNum1 = currNum1 + currNum2
- ADD AH, ECX; // currNum1 = currNum1 + carry
- MOV DL, AH; // currNum3 = currNum1
- MOV ECX, '0'; // carry = 0
- CMP DL, 10; // currNum3 >= 10
- JGE IF_3;
- JMP END_WHILE;
- IF_3:
- SUB DL, 10; // currNum3 = currNum3 - 10;
- MOV ECX, 0x31; // carry = 1;
- END_WHILE:
- DEC EDI; // posNum3 --
- ADD DL, '0'; // resNum[posNum3] = currNum3 +'0';
- MOV byte ptr[DH+EDI], DL;
- CMP EDI, 0; // check if posNum3 is >0
- JG WHILE;
- // END CODING HERE
- pop edx;
- pop ecx;
- pop ebx;
- pop eax;
- pop edi;
- pop esi;
- }
- return resNum;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement