簡體   English   中英

CMP和JGE在Turbo C ++中不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM