Project

General

Profile

Вызов программы ASM из Си » History » Version 7

« Previous - Version 7/20 (diff) - Next » - Current version
krufter_multiclet, 07/19/2013 06:05 PM


Вызов программы ASM из Си

Вызов программы, написанной на ассемблере из Си организован при помощи стека. Подробнее о стеке можно прочитать тут Обзор работы со стеком.

Рассмотрим пример вызова процедуры, написанной на ассемблере, из Си функцией типа void.

Пусть программа на ассемблере принимает два аргумента и выполняет их сложение, а также выдает результат через UART.

На Си вызов функции будет выглядеть так:

#include <HDL51001_ccf.h>

void function_add(int arg1, int arg2);

void main()
{
    int a,b;

    a = 19;
    b = 7;
    function_add(a,b);
    a = 20;
    b = 13;
    function_add(a,b);
}

На ассемблере будет следующее:

.alias ron2 4 ; в реальной программе мы должны сохранить текущие значения РОНов в стеке и только потом их использовать и 
.alias ron3 5 ; перед возвратом в Си восстановить их первоначальные значения, но для простоты примера мы это не сделаем.

;настриваем UART для платы HW1-MCp04
.alias UART_DATA    UART0_DATA
.alias UART_BDR     UART0_BDR
.alias UART_ST      UART0_ST
.alias UART_CR      UART0_CR

.alias UART_PORT_PIN  0x300
.alias UART_PORT_BPS  GPIOB_BPS

.global function_ex

.text

function_ex:
   rdl #SP, 4 ;получаем первый аргумент
   rdl #SP, 8 ;получаем второй аргумент
   addl @1, @2 ;складываем аргументы
   setl #ron3, @1
   jmp initUART
complete

initUART:
    getl 0x00000300
    wrl @1, UART_PORT_BPS
    getl 0x00000104
    wrl @1, UART_BDR
    getl 0x00000003
    wrl @1, UART_CR
    jmp send_byte_UART
    setl #ron2, 7
 complete

send_byte_UART:
    getl #ron2
    jne @1, send_byte_UART
    je @2, buf_TXD
    getq #ron3
    slrq @1, 8
    setq #ron3, @1
    wrl @3, UART_DATA
    subl @7, 1
    setl #ron2, @1
 complete

buf_TXD:
    rdl UART_ST
    getl 0x00000004
    and @1, @2
    je @1, buf_TXD
    jne @2, return
complete

return:
    rdl #SP
    jmp @1
complete

Параграфы function_ex и return составляют всю работы со стеком, т.е. работа со стеком заняла 3 команды.