C++ 从C+访问汇编语言+;

C++ 从C+访问汇编语言+;,c++,memory,assembly,mixed-mode,C++,Memory,Assembly,Mixed Mode,这是我的编程作业。我需要使用8086编程语言编写的方法找出整数数组中的最大值。这是我的尝试: #include <iostream.h> #include <conio.h> int returnLargest(int a[]) { int max; asm mov si,offset a for(int i=0;i<6;i++) //Assuming six numbers in th

这是我的编程作业。我需要使用8086编程语言编写的方法找出整数数组中的最大值。这是我的尝试:

  #include <iostream.h>
    #include <conio.h>

    int returnLargest(int a[])
    {
        int max;
        asm mov si,offset a

        for(int i=0;i<6;i++) //Assuming six numbers in the array...Can be set to a variable 'n' later
        {
              asm mov ax,[si]
              asm mov max,ax
              asm inc si
              cout<<max<<"\n";    //Just to see what is there in the memory location
        }

        asm mov si,offset a
        asm mov cx,0000h

        asm  mov dx, [si]

            asm mov cx,06h

        skip: asm   mov si,offset a
        asm mov bx,[si]
        asm        mov max,bx
        asm inc si
        abc: asm   mov bx,max
           asm     cmp [si],bx
        asm jl ok
           asm     mov bx,[si]
              asm  mov max,bx
        ok: asm loop abc
        asm mov ax,max
        return max;
    }
    void main()
    {
        clrscr();
        int n;
        int a[]={1,2,3,4,5,6};
        n=returnLargest(a);
        cout<<n; //Prints the largest
        getch();
    }

你必须确保你的编译器没有使用你的寄存器。最好的方法是在汇编中编写整个函数,并实现所需的调用约定(c-call或stdcall-无论什么)。然后从C/C++调用该函数


然而,如果您知道您将只使用一个编译器,并且它是如何工作的,那么内联汇编程序应该不会有任何问题,但这确实是一个陷阱。

mov si,偏移量a
是不正确的。当您将函数参数声明为
inta[]
时,函数实际上会收到一个指针。由于您需要指针值(
a
),而不是其地址(
&a
,在C中,
偏移量a
,在汇编中),请使用
mov si,a

此外,
inc si
似乎不正确-您需要将每个元素的
si
增加
sizeof(int)

编辑:

<>你正在使用程序集混合C++代码(<代码> <代码> >循环,<代码> cOUT >代码>)。C++代码很可能使用相同的寄存器,这会引起冲突。你应该避免这样做


您还需要根据所使用的调用约定,找出允许您的函数更改的寄存器。如果使用任何不允许更改的寄存器,则需要在开始时和代码> >代码>它们>结束时,POP < /COD>它们结束。

所以,您希望将8086汇编程序导入C++编译器而不是在C++中编写函数?带汇编的C++使用的是
int
数组(每个数组可能有4个字节)。你应该检查你读写的字节数是否正确,指针的增量是否正确。@Mike Seymour是的。这就是区别,但我一直在仔细计算汇编中的字节(引用代码,它检查$作为结束符号),在C++中,我只是手动将计数器保持为6。那为什么随机值会被打印出来呢???嗯,你确定
coutI不能相信这是一个家庭作业…我试过你说的。。。不明白。。。您能显示代码吗?不是
mov-si,而是偏移量a
write
mov-si,a
,而不是
inc-si
write
add-si,是一个int大小的东西(我不确定是否允许在内联汇编中写入
sizeof(int)
,如果不允许,请使用数字)。
data segment
    a   db  01h,02h,03h,04h,05h,06h,'$'
    max db  ?
data ends

code segment
    start:
        assume cs:code,ds:data
        mov ax,data
        mov ds,ax

        mov si,offset a
        mov cx,0000h

        back:   mov dl,byte ptr [si]
                cmp dl,'$'
        je skip
        inc cx
                inc si
        jmp back

    skip:   mov si,offset a
                mov bl,byte ptr[si]
                mov max,bl
        inc si
        abc:    mov bl,max
                cmp [si],bl
        jl ok
                mov bl,[si]
                mov max,bl
    ok: loop abc
        mov al,max
        int 03h
code ends
    end start