sopik Опубликовано 12 июня, 2010 Жалоба Поделиться Опубликовано 12 июня, 2010 Data SEGMENTGreet DB 'Привет, Маша!',13,10,'$' Data ENDS Stack SEGMENT StackDB 100H DUP(?) ;стек размером 256 байтов. Stack ENDS ASSUME CS:Code, DS:Data, SS:Stack Code SEGMENTStart:MOV AX,DATA ; загрузка номера сегмента (1)MOV DS,AX ; в регистр DS. (2)MOV DX,OFFSET Greet; загрузка в DX адреса симв. строки. (3)MOV AH,9 ; задание функции вывода строки. (4)INT 21H ; вывод строки. (5)MOV AL,0 ; завершение программы через (6)MOV AH,4CH ; системную функцию возврата (7)INT 21H ; в диспетчер MS DOS. (8) Code ENDS END Start ;адрес начала программы. компилятор Турбо Ассемблер не хочет работать. Операционная система Win7, перепробовал кучу вариантов ничего не получается. Подскажите кто-нить новичку. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
LomaK.XP Опубликовано 25 июля, 2010 Жалоба Поделиться Опубликовано 25 июля, 2010 Насколько я знаю в Win 7 вырезали поддержку 16-разрядной виртуальной машины (ntvdm). В x64 версии она точно вырезана. Пути решения : использовать 32 или 64 разрядные трасляторы : FASM, NASM, MASM, ... И вообще не надо писать на TASM =) (ИМХО). Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Форматцевт Опубликовано 25 июля, 2010 Жалоба Поделиться Опубликовано 25 июля, 2010 (изменено) sopik: ну не знаю зачем ассемблер для современного "железа" и технологий ПО, ибо нормальные языки, да и не нормальные, генерирую код лучше чем вы сможете написать. Доступ ко всем регистрам так же осуществляется, надо только правильно задать модель/схему компиляции. Если для обучения, то можно воспользоваться любым встроенным asm, ну скажем в С++ или WinAsm Studio или ну есть варианты, которых множество. Ну чем это хуже ассемблера? » Скрытый текст показать/скрыть « /****************************************************************************** ADC* Modified for PIC24FJ64GA004 family with PPS.****************************************************************************** FileName: adc.c* Dependencies: system.h, spimpol.c, eeprom.c* Processor: PIC24* Compiler: MPLAB C30* Linker: MPLAB LINK30* Company: Microchip Technology Incorporated** Software License Agreement** The software supplied herewith by Microchip Technology Incorporated* (the "Company") is intended and supplied to you, the Company's* customer, for use solely and exclusively with products manufactured* by the Company. ** The software is owned by the Company and/or its supplier, and is * protected under applicable copyright laws. All rights are reserved. * Any use in violation of the foregoing restrictions may subject the * user to criminal sanctions under applicable laws, as well as to * civil liability for the breach of the terms and conditions of this * license.** THIS SOFTWARE IS PROVIDED IN AN "AS IS" CONDITION. NO WARRANTIES, * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED * TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT, * IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.*** State machine to sample analog inputs for temperature sensor and potentiometer.** Author Date Comment*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~* Anton Alkhimenok 10/18/05 ...* Brant Ivey 3/14/06 Modified for PIC24FJ64GA004 family with PPS.*****************************************************************************/#include "system.h"/****************************************************************************** Module Constants Definitions *****************************************************************************///ADC channels numbers#define ADC_TEMPERATURE ADC_TEMP_CHAN#define ADC_VOLTAGE ADC_VOLT_CHAN// Delay after input switching#define ADC_SWITCH_DELAY 600// Temperature scale switching period#define ADC_CELSIUS_DELAY 100// Number position#define ADC_POS_NUMBER 6// Temperature scale sign position#define ADC_POS_SCALE 11// Memory sign position#define ADC_POS_MEM 13// Reference voltage, mV#define AVCC 3300/****************************************************************************** Arrays: _voltage_str and _temperature_str** Overview: These arrays contains voltage and temperature strings.******************************************************************************/char _voltage_str[16] = "Vol = V ";char _temperature_str[16] = "Tmp = C ";unsigned char _uADCState;unsigned int _uADCWait;// Period to switch temperature scaleunsigned int _uADCCelsiusWait;// Current temperature scaleunsigned char _uADCCelsius;// Buffer to filter temperature sensor valueunsigned int _uADCTemperature;// Switch to get temperature data from EEPROM rather than from ADCunsigned char _uADCFromMemory;/****************************************************************************** Function: ADCInit** Preconditions: None.** Overview: This function initiates ADC and state mashine.** Input: None.** Output: None.*******************************************************************************/void ADCInit(){AD1CON1 = 0x80E4; //Turn on, auto sample start, auto-convertAD1CON2 = 0; //AVdd, AVss, int every conversion, MUXA onlyAD1CON3 = 0x1F05; //31 Tad auto-sample, Tad = 5*TcyAD1CHS = ADC_VOLTAGE;TRISBbits.TRISB2 = 1;TRISBbits.TRISB3 = 1;AN_VOLT_PIN = 0; //Disable digital input on AN5AN_TEMP_PIN = 0; //Disable digital input on AN4AD1CSSL = 0; //No scanned inputs_uADCWait = ADC_SWITCH_DELAY;_uADCCelsiusWait = ADC_CELSIUS_DELAY;_uADCState = 1;_uADCCelsius = 0; //Show celsius scale _uADCFromMemory = 0; //Show current temperature}/****************************************************************************** Function: ADCProcessEvents** Preconditions: ADCInit must be called before.** Overview: This is a state mashine to grab analog data from potentiometer* and temperature sensor.** Input: None.** Output: None.*******************************************************************************/void ADCProcessEvents(){unsigned long Result;unsigned long rlt;switch(_uADCState){ case 1: // Convert result for potentiometer // Wait for conversion to complete while(!AD1CON1bits.DONE); Result = (long) ADC1BUF0; Result = (Result*AVCC)/1024; ADCShortToString((int)Result, 1, _voltage_str+ADC_POS_NUMBER); // Sweep least significant digit _voltage_str[ADC_POS_NUMBER+4] = ' '; // Switch input to temperature sensor AD1CHS = ADC_TEMPERATURE; _uADCState++; break; case 3: // Convert result for temperature // Wait for conversion to complete while(!AD1CON1bits.DONE); Result = (long) ADC1BUF0; // filter temperature Value // _uADCTemperature = 15/16*_uADCTemperature + 1/16*New Sample _uADCTemperature -= _uADCTemperature>>4; _uADCTemperature += Result; Result = _uADCTemperature>>4; // Read temperature stored into EEPROM _temperature_str[ADC_POS_MEM] = ' '; if(ADCIsFromMemory()){ Result = ADCLoadTemperature(); _temperature_str[ADC_POS_MEM] = 'M'; } if(0 == _uADCCelsiusWait--){ _uADCCelsiusWait = ADC_CELSIUS_DELAY; _uADCCelsius ^= 1; if(_uADCCelsius) _temperature_str[ADC_POS_SCALE]='C'; else _temperature_str[ADC_POS_SCALE]='F'; } if(_uADCCelsius) ADCShortToString((int)Result,3,_temperature_str+ADC_POS_NUMBER); else{ // Convert Celsius temperatures into Fahrenheit // Begin by multiplying the Celsius temperature by 9. // Divide the answer by 5. // Now add 32. Result *= 9; Result /= 5; Result += 320; ADCShortToString((int)Result, 3,_temperature_str+ADC_POS_NUMBER); } // Switch input to potentiometer AD1CHS = ADC_VOLTAGE; _uADCState++; break; case 2: case 4: // Delay slot between channel switching if(0 == _uADCWait--){ _uADCWait = ADC_SWITCH_DELAY; _uADCState++; } break; break; default: _uADCState = 1;}}/****************************************************************************** Function: ADCShortToString** Preconditions : None.** Overview: The function converts integer into string.** Input: Value - value to be converted; DotPos - dot position ( can be * between 0 and 3, DOTPOS_NONE = 4, if equals DOTPOS_TRAIL_ZEROS = -1 will not* put a dot and insert leading zeros); Buffer - receives the result string** Output: None.******************************************************************************/void ADCShortToString(int Value, char DotPos, char* Buffer){char Result;char Pos;// Clean Buffer (4 digits + Dot)for(Pos = 0; Pos < 5; Pos++) Buffer[Pos] = ' ';Pos = 0;if(Pos == DotPos){ *Buffer++ = '0';*Buffer++ = '.';}Pos++;Result = Value/1000;Value -= 1000*Result;if(Result) *Buffer++ = Result + '0';else if(Pos >= DotPos) *Buffer++ = '0';if(Pos == DotPos) *Buffer++ = '.'; Pos++;Result = Value/100;Value -= 100*Result;if(Result) *Buffer++ = Result + '0';else if(Pos >= DotPos) *Buffer++ = '0';if(Pos == DotPos) *Buffer++ = '.'; Pos++;Result = Value/10;Value -= 10*Result;if(Result) *Buffer++ = Result + '0';else if(Pos >= DotPos) *Buffer++ = '0';if(Pos == DotPos) *Buffer++ = '.'; Pos++;if(Value) *Buffer++ = Value + '0';else if(Pos >= DotPos) *Buffer++ = '0';} /****************************************************************************** Function: ADCStoreTemperature()** Preconditions: SPIMPolInit and EEPROMInit must be called before.** Overview: The function stores the current temperature into EEPROM.** Input: None.** Output: None.******************************************************************************/void ADCStoreTemperature(){unsigned Temp;// Get temperatureTemp = _uADCTemperature>>4;// Write MS byte into EEPROM address = 0EEPROMWriteByte(Hi(Temp),0);// Write LS byte into EEPROM address = 1EEPROMWriteByte(Lo(Temp),1);}/****************************************************************************** Function: ADCLoadTemperature()** Preconditions: SPIMPolInit and EEPROMInit must be called before.** Overview: The function returns temperature stored by ADCStoreTemperature* into EEPROM.** Input: None.** Output: Temperature value read from EEPROM.******************************************************************************/unsigned ADCLoadTemperature(){unsigned Temp;// Read MS byte from EEPROM address = 0Temp = EEPROMReadByte(0);Temp = (Temp<<8)&0xff00;// Read LS byte from EEPROM address = 1Temp |= (EEPROMReadByte(1)&0x00ff);// If there's not valid value replace it with 25.0 Cif(Temp > 990) Temp = 250;return Temp;}/****************************************************************************** Function: ADCSetFromMemory** Preconditions: None.** Overview: The function toggles switch to display temperature stored into EEPROM* rather than current one.** Input: None.** Output: None.******************************************************************************/void ADCSetFromMemory(){_uADCFromMemory ^=1; // Toggle switch}/****************************************************************************** Function: ADCIsFromMemory** Preconditions: None.** Overview: The function returns mode of EEPROM displaying.** Input: None.** Output: It returns zero if the current temperature is displyed.******************************************************************************/unsigned char ADCIsFromMemory(){return _uADCFromMemory;}/****************************************************************************** EOF*****************************************************************************/ Главное, что эффект тот же ;)PS Исходник не мой, просто для примера дал. Изменено 25 июля, 2010 пользователем Indomito Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Old Man Опубликовано 25 июля, 2010 Жалоба Поделиться Опубликовано 25 июля, 2010 Indomito Aссемблер используют еще для программирования микроконтроллеров. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Форматцевт Опубликовано 25 июля, 2010 Жалоба Поделиться Опубликовано 25 июля, 2010 (изменено) Old Man: я пишу программы для оных используя С, сейчас очень мало МС без языковой поддержки С. И если существуют кросс-ассемблер почти для каждого МК (раритет и уникум не берём в расчёт), то кросс-С тоже есть. Как пример - CVAVR. А если нет ассемблера, то ищем forth (да иногда выпускают МК с таким софтом), ну а в конечном итоге если совсем ничего нет то в кодах. Специалист по МК обычно знает 2-5 МК этого обычно достаточно, хотя 5 уже много ;) Хотя тут вопрос иного характера - в W7 не работает Tasm. Законный вопрос, а что писать на Tasm в W7? О МК, Forth и прошлом столетии. По языку Forth существует целая база для МК, такой даже нет для asm, тк реализовать Forth для конкретного МК намного проще чем написать asm, просто правится ядро, всё остальное дефинируется на уровне слов Forth. Очень редко нужна глобальная правка. Но это всё в прошлом, почти в прошлом, те в прошлом столетии. Изменено 25 июля, 2010 пользователем Indomito Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.