汇编语言与C或c++
Assembly language with C or C++
我应该用汇编语言和C或c++语言编写程序。C语言中的主模块的任务是从用户那里获取数据并显示结果。
在装配模块中有两个程序。
第一个必须从主模块获取实数数组,并返回数组元素的平均值。
第二个函数必须取一个字符数组和一个单个字符,并返回到数组中这些字符的和。
例如:
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或错误。在"搜索"中,我得到了错误的答案。
请帮帮我。谢谢你。
在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
)。
看看这个:
_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
- 如何修复此汇编语言程序
- 在 netbeans 中将C++代码输出为汇编语言
- 带有X64汇编语言的Univeral Windows平台C
- 如何在汇编语言ARM中使用Neon扩展高效地反转数组
- 有人在汇编语言级别解释左值和右值吗?
- 高级语言(例如Java)和汇编语言之间的关系
- 将此 C++ for 循环转换为汇编语言
- 汇编语言来学习C / C++语言
- C++转换为汇编语言
- 如何用汇编语言编写模数(C++中的%)
- 汇编语言扫描长字符串以计数元音
- 用于逆向工程的汇编语言
- 类从c++到汇编语言
- 无法在 Visual Studio 中生成汇编语言程序
- 内联汇编语言
- 用c++和汇编语言传递字符串参数
- 汇编语言中的While循环
- 在c++代码中使用嵌入式汇编语言进行错误分析
- 用c++汇编语言编写
- 汇编语言与C或c++