繁体   English   中英

C或C ++的汇编语言

[英]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+4G位于bp+8 请注意,您从错误的偏移量获取它们( ecxesi )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM