5

这是我的编程任务。我需要使用用 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();
    }

预期的答案是

1 2 3 4 5 6 6. 但我得到的是:在此处输入图像描述

在这里,我坐下来思考......不是数组的索引i处的值实际存储在内存中吗?因为至少我们被告知,如果 a[i] 是 12(比如说),那么第 i 个内存位置的内部写有数字 12。

或者如果该值没有存储在内存位置,我如何写入内存位置以完成所需的任务?

我还要求大家在网络/平装本上链接一些材料,以便复习这些概念。

编辑 :

汇编中的相同代码工作得很好......

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
4

2 回答 2

7

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

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

编辑:

您正在将 C++ 代码(for循环,cout)与您的程序集混合。C++ 代码很可能使用相同的寄存器,这会导致冲突。你应该避免这样做。

您还需要根据使用的调用约定找出允许您的函数更改哪些寄存器。如果您使用任何不允许更改的寄存器,您需要push在开始和pop结束时使用它们。

于 2011-11-09T16:14:21.920 回答
3

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

但是,如果您知道您将只使用一个编译器以及它是如何工作的,那么您不应该通过内联汇编程序遇到任何问题,但这确实是一个陷阱。

于 2011-11-09T16:09:58.183 回答