組み立て
TITLE adding numbers
.486
.MODEL FLAT,C
option casemap:none
include C:\Users\Thao\Hello\msvcrt.inc
.data
formating DB "%s",10,0
DB 0
num1 DB "0000000000"
DB 0
num2 DB "0000000000"
DB 0
AC_balance DB "0000000000"
DB 0
.code
adding PROC C, number1:DWORD , number2:DWORD
mov esi, number1
lea edi, num1
mov ecx, SIZEOF num2
rep movsb
mov eax, offset num1
push eax
mov eax, OFFSET formating
push eax
call printf
pop eax
pop eax
;---------------------------------------------------
mov esi, number2
lea edi, num2
mov ecx, SIZEOF num2
rep movsb
mov eax, OFFSET num2
push eax
mov eax, OFFSET formating
push eax
call printf
pop eax
pop eax
mov esi,SIZEOF num1-1
mov edi,SIZEOF num1-1
mov ecx,SIZEOF num1
mov bh,0 ;used to save carry value
L1: mov ah,0 ;clear AH before the add
mov al,num1[esi] ;get a digit
add al,bh ;add previous carry (0 first time through)
aaa ; adjust the total
mov bh,ah ; save the carry in BH
or bh,30h ;convert carry to ASCII character
add al, num2[esi] ;perform main add
aaa ; adjust the main add, AH gets the carry
or bh,ah ; combine the carries
or bh,30h ; convert back to ASCII
or al,30h ; convert digit back to ascii
mov num2[edi],al ;save total digit
dec esi ;move left 1 digit in addends
dec edi ;move left 1 digit in result
loop L1
mov eax, offset num2
push eax
mov eax, offset formating
push eax
call printf
pop eax
pop eax
mov eax, offset num2
ret
adding ENDP
END
Cコード
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
char *adding(char *y,char *x);
void _tmain(void)
{
char *a, *b, *a1, *b1;
int z = 6;
int sizeA =9;
int sizeB =9;
a = (char*)malloc(11*sizeof(char));
b = (char*)malloc(11*sizeof(char));
a1 = (char*)malloc(11*sizeof(char));
b1 = (char*)malloc(11*sizeof(char));
strcpy(a, "0000000000");
strcpy(b, "0000000001");
strcpy(a1, "3234567890");
strcpy(b1, "1234567890");
printf("adding A\n");
a=adding(a1,a);
printf("a: %s\n",a);
printf("adding B\n");
b=adding(b1,b);
printf("a: %s\n",a);
printf("b: %s\n",b);
getchar();
}
現在の出力
adding A
3234567890
0000000000
a: 3234567890
adding B
1234567890
0000000001
a: 1234567891
b: 1234567891
なんらかの理由でアドレスを削除しているので、ビジュアルスタジオでデバッグしているときに、アドレスが上書きされているように見えることに気づきました。そして、なぜ、どのように上書きされるのかわかりません。実行の終わりまでに、A と B は同じものを指しています。この時点で何をすべきかまったくわかりません..
私はそれが私のアセンブリコードと関係があることを知っています..しかし、私が間違っていることはわかりません。スタックと何か関係がありますか?