汇编语言与C或c++

Assembly language with C or C++

本文关键字:c++ 汇编语言      更新时间:2023-10-16

我应该用汇编语言和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*。在循环中每次递增寄存器,而不是递增bpbp需要保持不变,直到你退出你的函数。

同样,abp+8,而不是bp+6。您可能需要检查编译器设置,以确定arr实际上是在bp+12还是bp+10。这取决于编译器是将char推入为2字节还是4字节。

同时,您将无条件地对数组循环100次。假设n是你的数组大小,所以把它移到cx,并使用cx作为你的循环计数器。

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

看看这个:

_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