gpt4 book ai didi

c++ - 使用 C 或 C++ 的汇编语言

转载 作者:行者123 更新时间:2023-11-30 17:33:09 27 4
gpt4 key购买 nike

我应该用汇编语言和 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

我正在使用 DosBox 和 BorlandC 编译器。在“平均值”中,我的结果始终为 0 或错误。在“搜索”中我得到了错误的答案。

请帮我解决这个问题。谢谢。

最佳答案

在您的搜索函数中,您将al[bp+12]进行比较。这只适用于第一个角色。当你添加到 bp 时,你就会弄乱你的堆栈框架。 [bp+12] 是您的 char*。您需要将 [bp+12] 移动到寄存器并将该寄存器用作您的 char*。每次通过循环递增该寄存器,而不是递增 bpbp 需要保持不变,直到退出函数。

此外,a 位于 bp+8,而不是 bp+6。您可能需要检查编译器设置,以确定 arr 实际上是在 bp+12 还是 bp+10。这取决于编译器是否将 char 插入 2 个字节或 4 个字节。

此外,您无条件地循环数组 100 次。据推测,n 是您的数组大小,因此将其移至 cx 并使用 cx 作为循环计数器。

在您的 sum 函数中,tab 位于 bp+4 处,G 位于 bp 处+8。请注意,您从错误的偏移量获取它们(ecxesi)。

关于c++ - 使用 C 或 C++ 的汇编语言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23856553/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com