[英]Assembly language with C or C++
我应该用Assembly和C或C ++语言编写程序。 C语言中的主要模块负责从用户那里获取数据并显示结果。
组装模块中有2个过程。
第一个必须从主模块获取实数数组,并返回该数组元素的平均值。
第二个必须包含字符数组,一个必须包含单个字符,然后将这些字符在数组中的总和返回主模块。
例如:
array: 'Kangaroo'
character: 'o'
Return 2.
我已经写了这个,但是没有用。 我不知道怎么了...
在C ++代码中,我有:
extern "C" float average(float* tab, int G);
extern "C" int search(int n, char a, char* arr);
这样就可以了。
但是这是我的汇编代码:
.386
.model SMALL,c
PUBLIC search
PUBLIC average
.stack 400h
.data
_Result DW ?
one dd 1.0
.code
search PROC
push bp
mov bp, sp
mov dx, 0
mov al, [bp+6]
mov cx,0
jmp compare
compare:
cmp al, [bp+12]
je increment
jmp continue
increment:
inc cx
jmp continue
continue:
add bp, 1
inc dx
cmp dx, 100
jne compare
jmp end
end:
mov _Result, cx
mov ax, _Result
pop bp
ret
search ENDP
average PROC
push ebp
mov esp,ebp
push esi
mov ecx, [ebp+12]
mov esi, [ebp+8]
finit
fldz
denominator:
fld dword PTR one
fld dword PTR [esi]
fdivp st(1), st(0)
faddp st(1),st(0)
add esi,4
loop denominator
pop esi
pop ebp
ret
average ENDP
END
我正在使用带有BorlandC编译器的DosBox。 在“平均”中,我总是将结果设为0或错误。 在“搜索”中,我有错误的答案。
请在这件事上给予我帮助。 谢谢。
看看这个:
_Sum:
push ebp ; create stack frame
mov ebp, esp
mov eax, [ebp+8] ; grab the first argument
mov ecx, [ebp+12] ; grab the second argument
add eax, ecx ; sum the arguments
pop ebp ; restore the base pointer
ret
您需要在开始时设置堆栈,然后适当地从堆栈中获取参数。 我非常相信,您的代码中的[bp+6]
可能会导致麻烦,因为没有适合此偏移量的数据类型。 有关混合C和汇编的更多信息,请参见: http : //courses.engr.illinois.edu/ece390/books/labmanual/c-prog-mixing.html
在search
功能中,您将al
与[bp+12]
进行比较。 这仅适用于第一个字符。 当您添加到bp时,您正在弄乱堆栈框架。 [bp+12]
是您的字符*。 您需要将[bp+12]
移至一个寄存器并将该寄存器用作char*
。 每次通过循环递增该寄存器,而不是递增bp
。 bp
需要保持不变,直到退出功能为止。
另外, a
位于bp+8
,而不是bp+6
。 您可能需要检查编译器设置,以找出arr
实际上是bp+12
还是bp+10
。 这取决于编译器将char推为2字节还是4。
此外,您无条件遍历数组100次。 大概n
是您的数组大小,因此将其移动到cx
并将cx
用作循环计数器。
在sum
函数中, tab
位于bp+4
而G
位于bp+8
。 请注意,您从错误的偏移量获取它们( ecx
和esi
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.