Вызов программы ASM из Си » History » Version 3
« Previous -
Version 3/20
(diff) -
Next » -
Current version
krufter_multiclet, 07/19/2013 05:56 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 ; восстановить их первоначальные значения, но для простоты примера мы это не сделаем. .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