Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.12.2015, 15:46   #1
andrew_ryaba
Пользователь
 
Регистрация: 29.12.2013
Сообщений: 21
По умолчанию связь с и ассемблера

Подскажите, пожалуйста, почему не выводит результат?
AsmMainN.asm
Код:
.286
.MODEL Small

_DATA segment public 'DATA'
	E dw 1,0,2,-5,10,23,0,31,19,-10,12,-1,3,4,0,0,18,14,1,10,12,-5,-7,-50,10,13,18,10,-6,15  ;Массив чисел
	n dw 30			;Размерность массива
	sred dw ?		;Среднее значение
	zero dw ?		;Количество нулей
	stroka db 140 dup(?)		;Строка для вывода массива на экран
_DATA ends

Stack_ SEGMENT Stack	;Стековый сегмент
	dw 100 dup(?)
Stack_ ends

_TEXT segment public 'CODE'
	Extrn _rabota : near
Assume CS:_TEXT, DS:_DATA, SS:Stack_
Main proc far
	push ds			;Операции, необходимые для последующего
	mov ax,0		;Возврата в операционную систему
	push ax
	mov ax,_DATA	;Устанавливаем, что Data у нас является сегментом данных
	mov ds,ax
	mov zero,0		;Обнуляем знаения
	mov sred,0
	push offset E	;Загружаем передаваемые параметры в стек
	push offset sred
	push offset zero
	push n
	
	call _rabota	;Вызов внешней процедуры
	add sp,8		;Поправка стека
	
	mov cx,n		;Действия для вывода чисел на консоль
	mov si,offset E
	mov di,offset stroka
OutConsole:
	mov ax,[si]		;Преобразуем числа из массива
    call word_to_sdec_str
	mov [di],' '
	inc di
	add si,2
	loop OutConsole
	
	mov [di],10		;Преобразуем полученные значения
	inc di
	mov ax,zero
	call word_to_sdec_str
	mov [di],10
	inc di
	mov ax,sred
	call word_to_sdec_str
	
	mov [di],'$'	;Всё в одной строке, признак конца строки
	
	mov di,offset stroka
	call print_str	;Вывод на экран
	ret
Main endp

word_to_udec_str proc near
    xor cx,cx               ;Обнуление CX
    mov bx,10               ;В BX делитель (10 для десятичной системы)
 
wtuds_lp1:                  ;Цикл получения остатков от деления
    xor dx,dx               ;Обнуление старшей части двойного слова
    div bx                  ;Деление AX=(DX:AX)/BX, остаток в DX
    add dl,'0'              ;Преобразование остатка в код символа
    push dx                 ;Сохранение в стеке
    inc cx                  ;Увеличение счетчика символов
    test ax,ax              ;Проверка AX
    jnz wtuds_lp1           ;Переход к началу цикла, если частное не 0.
 
wtuds_lp2:                  ;Цикл извлечения символов из стека
    pop dx                  ;Восстановление символа из стека
    mov [di],dl             ;Сохранение символа в буфере
    inc di                  ;Инкремент адреса буфера
    loop wtuds_lp2          ;Команда цикла
 
    ret
word_to_udec_str endp

;Процедура преобразования слова в строку
; АХ - словл
; DI - адрес строки	
word_to_sdec_str proc near
    push ax
	push cx
    push dx
    push bx
    test ax,ax              ;Проверка знака AX
    jns wtsds_no_sign       ;Если >= 0, преобразуем как беззнаковое
    mov [di],'-'       		;Добавление знака в начало строки
    inc di                  ;Инкремент DI
    neg ax                  ;Изменение знака значения AX
wtsds_no_sign:
    call word_to_udec_str   ;Преобразование беззнакового значения
	pop bx
    pop dx
    pop cx
    pop ax
    ret
word_to_sdec_str endp	

;Процедура вывода строки на консоль
; DI - адрес строки
print_str proc near			
    push ax
    mov ah,9                ;Функция DOS 09h - вывод строки
    xchg dx,di              ;Обмен значениями DX и DI
    int 21h                 ;Обращение к функции DOS
    xchg dx,di              ;Обмен значениями DX и DI
    pop ax
    ret
print_str endp

_TEXT ends
End Main
rabotac.cpp:
Код:
#include <stdio.h>;
#include<conio.h>;
extern "C" void rabota(int n, int *zero, int *sred, int E[]) {

	int min = 999, minNum = 0, cols = 0;
	int i;
	for (i = 0; i < n; i++)  //Поиск минимального
		if (E[i] < min) {
			min = E[i];
			minNum = i;
		}
	
	for (i = 0; i < minNum; i++) //Подсчет нулей
		if (E[i] == 0)
			*zero = *zero+1;
			//*zero++;
	
	for (i = minNum + 1; i < n; i++) //Поиск среднего положительного после минимального
		if (E[i] > 0) {
			*sred += E[i];
			cols++;
		}
	*sred /= cols;
	return;
}
Связываю с помощью команды
bcc -I..\include -L..\lib -eAsmAndC.exe AsmMainN.asm -v rabotac.cpp
Не выводится результат после запуска в консоли AsmAndC.exe
andrew_ryaba вне форума Ответить с цитированием
Старый 22.12.2015, 16:06   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

а запускаете вы это где? в досбоксе?
p51x вне форума Ответить с цитированием
Старый 22.12.2015, 16:14   #3
andrew_ryaba
Пользователь
 
Регистрация: 29.12.2013
Сообщений: 21
По умолчанию

да, запускаю в досбоксе
andrew_ryaba вне форума Ответить с цитированием
Старый 22.12.2015, 17:30   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А он вообще что нибудь выводит? Ты не пробовал отлаживать Turbo Debugger-ом экзешник??
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.12.2015, 18:14   #5
andrew_ryaba
Пользователь
 
Регистрация: 29.12.2013
Сообщений: 21
По умолчанию

Вообще ничего не выводится
andrew_ryaba вне форума Ответить с цитированием
Старый 22.12.2015, 20:22   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

И с Турбодебугером ты отладку не делал?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.12.2015, 20:31   #7
andrew_ryaba
Пользователь
 
Регистрация: 29.12.2013
Сообщений: 21
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
И с Турбодебугером ты отладку не делал?
Я с ним не очень пока дружу. Знаю, что надо бы освоить.
Просто я полагал, что, возможно, кто-нибудь заметит в коде очевидную незамеченную мной ошибку
andrew_ryaba вне форума Ответить с цитированием
Старый 22.12.2015, 22:52   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Боюсь, что без отладки много тебе не сделать...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Команда Ассемблера vitik Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 03.01.2014 04:56
Команды ассемблера JoBl Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 25.05.2012 13:13
язык ассемблера nastya_m Помощь студентам 5 07.12.2011 13:15
Основы ассемблера Maksim_27_10 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 08.07.2010 12:24
вставки из ассемблера макс07 Общие вопросы C/C++ 7 13.05.2008 19:19