C++ 从C+访问汇编语言+;
这是我的编程作业。我需要使用8086编程语言编写的方法找出整数数组中的最大值。这是我的尝试: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
#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
writemov-si,a
,而不是inc-si
writeadd-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