Visual Studio 2010 — CMP и JGE не работают в Turbo Stack Overflow

Я работаю над программой Mix на C ++ и ассемблере (8086), чтобы найти наименьшее число из массива. Вот мой код

#include<iostream>
#include<conio.h>
using namespace std;
void main()
{
__int16 a[5],x,y,res;
int i,j;
y=999;

cout<<"\n Enter 5 Numbers:";
for(i=0;i<5;i++)
{
cin>>a[i];
}

_asm{
mov bx,y
}

//Finding smallest
for(i=0;i<5;i++)
{
x=a[i];
_asm{
mov ax,x
cmp ax,bx
jge nxt
mov bx,ax
nxt:
}
}

_asm{
mov res,bx;
}

cout<<"\n Smallest Element:"<<res;
getch();
}

Приведенный выше код написан в Visual Studio 2010 и, кажется, работает нормально. Но когда я обновляю тот же код для Turbo C ++ (т. Е. Меняя «iostream» на «iostream.h», удаляя «используя пространство имен std;», меняя «__int16» на «int» и т. Д.), Это не работает. Ответ, полученный после исполнения, неверен.

Вот моя программа TC ++ для того же

#include<iostream.h>
#include<conio.h>
void main()
{
int a[5],x,y,res;
int i,j;
y=999;

cout<<"\n Enter 5 Numbers:";
for(i=0;i<5;i++)
{
cin>>a[i];
}

_asm{
mov bx,y
}

//Finding smallest
for(i=0;i<5;i++)
{
x=a[i];
_asm{
mov ax,x
cmp ax,bx
jge nxt
mov bx,ax
}
nxt:
}

_asm{
mov res,bx;
}

cout<<"\n Smallest Element:"<<res;
getch();
}

Почему TC ++ и Visual Studio 10 не дают одинакового ответа?

0

Решение

Вы не можете ожидать, что регистры сохранят свои значения между фрагментами сборки. У вас есть три сборочных фрагмента с кусками C между ними, и они полагаются на bx оставаясь прежним Компилятор не дает такого обещания.

Либо используйте память для хранения рабочего минимума, либо переформулируйте с помощью одного фрагмента сборки. Для последнего подхода вам придется переписать цикл for и доступ к массиву в сборке; это вполне выполнимо. Как это:

_asm{
mov dx, y ; we'll use dx instead of bx for the running minimum - long story
mov bx, a   ; that's the array pointer
mov si, 0 ; that's our i
loop:
mov ax, [bx+si*2] ; read a[i] into ax; *2 because int is two bytes
cmp ax,dx
jge nxt
mov dx, ax
nxt:
;Now the for loop stuff
inc si ; i++
cmp si, 5 ; compare i to 5
jl loop   ; if less, continue looping
; End of loop
mov res,dx;
}

Я использую bx и si для доступа к памяти base + index, потому что на ранних процессорах x86 такой доступ к памяти можно было выполнять только с ограниченным подмножеством регистров (bx или bp для base, si или di для индекса). В наши дни вы можете использовать любую комбинацию регистров; но я не уверен, что антиквариат Turbo C справится с этим.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]