[英]CMP and JGE not working in Turbo C++
我正在使用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沒有給出相同的答案?
您不能期望寄存器在匯編代碼片段之間保留其值。 您有三個匯編代碼段,它們之間有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進行基本+索引內存訪問,因為在早期的x86 CPU上,您只能使用有限的寄存器子集(bx或bp用於基數,si或di用於索引)來進行這種內存訪問。 如今,您可以使用寄存器的任意組合。 但是我不確定古董Turbo C是否會接受。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.