Вызов процедуры на языке ассемблер из программы на Си - Assembler
Формулировка задачи:
Всем здравствуйте! может сможете мне помочь, тут такая вот беда случилась... Мне нужно написать функцию на ассемблере и вызывать ее в программе на СИ. Задание такое: удалить все пробелы при просмотрела строки с права налево. Программа вроде написана, но при тестировании, выдает ошибку (смотри скрин). Не знаю что делать, помогите.
используется соглашение _cldecl
текст основной программы на Си
#include <stdio.h> #include <conio.h> #include <locale.h> extern "C" char *st(char *str, int l); void main() { int l = 0; setlocale(LC_CTYPE, "Russian"); char str[100]; char *str1; str1 = new char[100]; FILE *f = fopen("data.txt", "r"); int i,flag = 0; for (i = 0; !feof(f); i++) { fscanf(f, "%c", &str[i]); } l = i; str[i-1] = '\0'; for ( i = 0; str[i] != '\0' && flag==0; i++) { if (str[i] == ' ') flag = 1; } if (flag == 0) printf("%s", str); else { str1=st(str, l); } _getch(); }
.386 ;Архитектура .MODEL FLAT ;Плоская модель памяти соглашение о вызовах .DATA ;Сегмент данных BUF DB 100 DUP (?) LENS DD ? VAL DB 0 .CODE ;Сегмент кода _st PROC POP LENS POP ESI ADD ESI, LENS MOV ECX, LENS MOV EDI, OFFSET BUF CHECK: MOV DL,' ' MOV AL,[ESI] CMP DL,AL JE @END MOV [EDI],AL INC EDI @END: DEC ESI LOOP CHECK MOV EAX,EDI RET _st ENDP END
Решение задачи: «Вызов процедуры на языке ассемблер из программы на Си»
textual
Листинг программы
MOV EAX,offset buf
Объяснение кода листинга программы
- Переменная EAX используется для хранения адреса буфера.
- Команда MOV используется для перемещения значения offset buf в EAX.
- Значение offset buf является смещением относительно начала буфера, где хранится информация, которую нужно передать в процедуру на языке ассемблера.