亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? source.c

?? AVR反匯編,對(duì)ATMEGA8有效
?? C
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
/*
  Program: revava - Atmel Dis-Assembler
  File: Source.C, Copyright (C) 2001 Daniel J. Winker

  This program is free software; you can redistribute it and/or
  modify it under the terms of the GNU General Public License
  as published by the Free Software Foundation; either version 2
  of the License, or (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software
  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

  CHANGES:
  14-Mar-2001, Dan Winker
  Added op_code_addr.  See Bug_0001 in CHANGES.
*/

#include <stdio.h>
#include <string.h>

#include "Avr.h"
#include "Error.h"
#include "Flash.h"
#include "Source.h"

#define FALSE 0
#define TRUE  (!FALSE)

//#define DEBUG

char* m8_IO_register_name[] = {
						"TWBR",
						"TWSR",
						"TWAR", 
						"TWDR",    
						"ADCL", 
						"ADCH",
						"ADCSRA",
						"ADMUX",
						"ACSR ",
						"UBRRL",
						"UCSRB",
						"UCSRA",
						"UDR",
						"SPCR",
						"SPSR",
						"SPDR",
						"PIND",
						"DDRD",
						"PORTD",
						"PINC",
						"DDRC",
						"PORTC",
						"PINB",
						"DDRB",
						"PORTB",
						"Reserved",
						"Reserved",
						"Reserved",
						"EECR",
						"EEDR",
						"EEARL",
						"EEARH",
						"UBRRH",
						"WDTCR",
						"ASSR",
						"OCR2",
						"TCNT2",
						"TCCR2",
						"ICR1L",
						"ICR1H",
						"OCR1BL",
						"OCR1BH",
						"OCR1AL",
						"OCR1AH",
						"TCNT1L",
						"TCNT1H",
						"TCCR1B",
						"TCCR1A",
						"SFIOR",
						"OSCCAL",
						"TCNT0",
						"TCCR0",
						"MCUCSR",
						"MCUCR",
						"TWCR",
						"SPMCR",
						"TIFR",
						"TIMSK",
						"GIFR",
						"GICR",
						"Reserved",
						"SPL",
						"SPH",
						"SREG"

				};

TSourceOut::TSourceOut( const char* OutFile, TFlash* pFlash ){
	TAvr               Avr;
	TAvr::TInstruction Instruction;
	int                Index;
	int                line_count;
	FILE*              pOutFile;
	TSourceString*     pSourceString_temp;
	TSourceString*     pSourceString_head;
	TSourceString*     pSourceString_tail;
	int                last_line_was_blank = FALSE;
	int                look_for_new_segment = TRUE;
	int                code_seg_num = 0;
	unsigned short     code_word;
	unsigned short     temp_short;
	unsigned long      temp_long;
	int                addr;
	int                op_code_addr;
	int                dest = 0;
	int                have_dest;
	int                high_byte_written;
	int                low_byte_written;
	char               temp_string[ 80 ]; // FIXME - Magic Number
	char               temp_string2[ 80 ]; // FIXME - Magic Number
	char*              pLastTab;
	char*              tabs;

	prolog_head = NULL;
	prolog_tail = NULL;
	body_head   = NULL;
	body_tail   = NULL;

	if( 0 == strcmp( "stdout", OutFile ) ){
		pOutFile = stdout;
	} else {
		pOutFile = fopen( OutFile, "w" );
	}

	if( NULL == pOutFile )
		throw TFileError( "Cannot open file for writing:", OutFile );

	// FIXME - This probably doesn't belong burried deep withing a function.
	// This probably should be much more configurable.
	//push_prolog( "#arch AT90S8515" );
	push_prolog( "#include \"m8def.inc\" ");
	//push_prolog( "#include \"avr.inc\"" );

	for( addr = 0; addr < FLASH_SIZE; addr += 2 ){

		// Sometimes addr will get bumped because of a double word
		// instruction, but we still want to report the address of the
		// first word of the instruction.  op_code_addr is what is
		// reported.
		op_code_addr = addr;

		code_word = pFlash->get_flash_word(
			addr,
			&high_byte_written,
			&low_byte_written );

		#ifdef DEBUG_1
			printf( "DEBUG - SourceOut: ##############################\n" );
			printf( "DEBUG - SourceOut: addr              = %04X\n", addr );
			printf( "DEBUG - SourceOut: code_word         = %04X\n", code_word );
			printf( "DEBUG - SourceOut: high_byte_written = %04X\n", high_byte_written );
			printf( "DEBUG - SourceOut: low_byte_written  = %04X\n", low_byte_written );
		#endif

		if( high_byte_written != low_byte_written ){
			sprintf(
				temp_string,
				"TSourceOut: Word Address: %04X: high_byte_written != low_byte_written.",
				addr );
			throw TGenericError( temp_string ); 
		}


		if( high_byte_written ){

			if( look_for_new_segment ){
				#ifdef DEBUG
					printf( "DEBUG - SourceOut: Need Org Statement For: %04X\n", addr );
				#endif

				//sprintf( temp_string, "\tseg abs=0x%X flash.code%d", addr, code_seg_num );
				sprintf( temp_string, "\t.org 0x%X", addr/2);
				push_body( "" );
				push_body( temp_string );
				push_body( "" );
				last_line_was_blank = TRUE;

				code_seg_num++;
				look_for_new_segment = FALSE;
			}

			// First Time Through
			pSourceString_head = NULL;
			pSourceString_tail = NULL;
			Index = 0;
			while( 0 != ( Index = Avr.Word2Instruction(
				&Instruction,
				code_word,
				Index ))){

				#ifdef DEBUG
					printf( "DEBUG - SourceOut: Index                   = %d\n", Index);
					printf( "DEBUG - SourceOut: Addr:OpCode             = %04X:%04X\n", addr, code_word );
					printf( "DEBUG - SourceOut: Instruction.name        = %s\n",   Instruction.name );
					printf( "DEBUG - SourceOut: Instruction.arg0_format = %c\n",   Instruction.arg0_format );
					printf( "DEBUG - SourceOut: Instruction.arg1_format = %c\n",   Instruction.arg1_format );
					printf( "DEBUG - SourceOut: Instruction.arg0_type   = %d\n",   Instruction.arg0_format );
					printf( "DEBUG - SourceOut: Instruction.arg1_type   = %d\n",   Instruction.arg1_format );
					printf( "DEBUG - SourceOut: Instruction.arg0        = %04X\n", Instruction.arg0 );
					printf( "DEBUG - SourceOut: Instruction.arg1        = %04X\n", Instruction.arg1 );
				#endif

				have_dest = FALSE;

				if( TAvr::ARG_longCall == Instruction.arg0_type ){

					// These arg types are special because they also use the
					// next word as part of the opcode.

					// A really paranoid programmer would do a bounds check
					// on addr here.
					addr += 2;
					temp_short = pFlash->get_flash_word(
						addr,
						&high_byte_written,
						&low_byte_written );

					if( !high_byte_written || !low_byte_written ){
						sprintf(
							temp_string,
							"TSourceOut: Word Address: %04X: Needed Entire Word Written",
							addr );
						throw TGenericError( temp_string ); 
					}

					temp_long =
						( (unsigned long)Instruction.arg0 << 16 ) |
						( (unsigned long)temp_short );

					sprintf(
						temp_string,
						"\t%s\t0x%04lX",
						Instruction.name,
						temp_long );

				} else if(
					TAvr::ARG_neg64_63   == Instruction.arg0_type ||
					TAvr::ARG_neg2KB_2KB == Instruction.arg0_type ) {

					// We insist that arg types of ARG_neg64_63 and
					// ARG_neg2KB_2KB have an arg format of 'k'.
					if( 'k' != Instruction.arg0_format ){

						sprintf(
							temp_string,
							"TSourceOut:\n"
							"\t%s instruciton has arg0_type = ARG_neg64_63 or ARG_neg2KB_2KB\n"
							"\twith 'k' != ( arg0_format = '%c' )",
							Instruction.name,
							Instruction.arg0_format );
				
						throw TGenericError( temp_string ); 
					}

					// We also insist that arg0 types of ARG_neg64_63 and
					// ARG_neg2KB_2KB do not have an arg1.
					if( TAvr::ARG_none != Instruction.arg1_type ){

						sprintf(
							temp_string,
							"TSourceOut:\n"
							"\t%s instruciton has arg0_type = ARG_neg64_63 or ARG_neg2KB_2KB\n"
							"\twith ARG_none != arg1_type",
							Instruction.name );
				
						throw TGenericError( temp_string ); 
					}

					sprintf(
						temp_string,
						"\t%s\t%d",
						Instruction.name,
						(short)Instruction.arg0 );

					have_dest = TRUE;
					//there is a special case;
					if(Instruction.arg0<0 && Instruction.arg0<-2*1024){
						unsigned int offset = 0;
						offset = addr + 2 + 0x2000 + Instruction.arg0;
						offset = offset &0x0000FFFF;
						dest = offset;
					}else{
						dest = addr + 2 + (short)Instruction.arg0;
					}

				} else if (TAvr::ARG_0_PAIR==Instruction.arg0_type){
						sprintf(
								temp_string,
								"\t%s\tr%d:r%d",
								Instruction.name,
								Instruction.arg0*2+1,Instruction.arg0*2);
				}else{

					switch( Instruction.arg0_format ){

						case '\0':

							// No args to this instruction
							sprintf(
								temp_string,
								"\t%s",
								Instruction.name );

							break;

						case 'd':
						case 'r':
							//change register name
							char r_name[4];
							sprintf(r_name,"r%d",Instruction.arg0);
							switch(Instruction.arg0){
								case 26:
									strcpy(r_name,"XL");
									break;
								case 27:
									strcpy(r_name,"XH");
									break;
								case 28:
									strcpy(r_name,"YL");
									break;
								case 29:
									strcpy(r_name,"YH");
									break;
								case 30:
									strcpy(r_name,"ZL");
									break;
								case 31:
									strcpy(r_name,"ZH");
									break;

							}
							sprintf(
								temp_string,
								"\t%s\t%s",
								Instruction.name,
								r_name );

							break;

						case 'k':
						case 's':

							sprintf(
								temp_string,
								"\t%s\t%d",
								Instruction.name,
								(short)Instruction.arg0 );

							break;

						case 'P':
						case 'p':
							//need to translate to I/O register name;

							/*sprintf(
								temp_string,
								"\t%s\t0x%X",
								Instruction.name,
								Instruction.arg0 );*/
							sprintf(
								temp_string,
								"\t%s\t%s",
								Instruction.name,
								m8_IO_register_name[Instruction.arg0] );

							break;

						case 'X':
						case 'Y':
						case 'Z':

							if( 0 == strcmp( "std", Instruction.name )){
								sprintf(
									temp_string,
									"\t%s\t%c+%d",
									Instruction.name,
									Instruction.arg0_format,
									Instruction.arg0 );

							} else {

								// It's a little convoluted how we get the
								// information back from TAvr::AdjustArg about
								// whether to us "X", "X+", or "-X".  In this
								// arg_format is 'X'.  We differentiate by
								// setting the value of arg (which is an
								// (unsigned short)) to one of ' ', '+' or '-'.
								switch( (char)Instruction.arg0 ){

									case ' ':

										sprintf(
											temp_string,
											"\t%s\t%c",
											Instruction.name,
											Instruction.arg0_format );

										break;

									case '+':

										sprintf(
											temp_string,
											"\t%s\t%c+",
											Instruction.name,
											Instruction.arg0_format );

										break;

									case '-':

										sprintf(
											temp_string,
											"\t%s\t-%c",
											Instruction.name,
											Instruction.arg0_format );

										break;

									default:

										sprintf(
											temp_string,
											"TSourceOut:\n"
											"\t%s instruction has special arg0_format: '%c'\n"
											"\twith unknown arg0 of: 0x%X",
											Instruction.name,
											Instruction.arg0_format,
											Instruction.arg0 );
				
										throw TGenericError( temp_string ); 

										break;

								}
							}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美mv日韩mv国产网站| 91精品国产全国免费观看| 日韩美女在线视频| 亚洲免费成人av| 国产成人精品免费| 777欧美精品| 亚洲制服丝袜av| 处破女av一区二区| 日韩一区二区三区在线视频| 国产成人一区在线| 91精品国产日韩91久久久久久| 亚洲视频一二三区| 国产大陆a不卡| 日韩精品一区二| 日韩国产欧美视频| 色www精品视频在线观看| 中文字幕欧美日韩一区| 久久国产综合精品| 欧美一区二区三区男人的天堂| 一区二区三区中文在线观看| 99久久免费精品| 欧美韩日一区二区三区| 国内精品免费**视频| 欧美一级片免费看| 亚洲1区2区3区4区| 欧美亚州韩日在线看免费版国语版| 中文字幕av一区 二区| 国内精品视频一区二区三区八戒| 日韩一区二区视频| 日本欧洲一区二区| 欧美一级片免费看| 日本va欧美va瓶| 欧美精品精品一区| 天天综合日日夜夜精品| 欧美色网一区二区| 亚洲一区二区精品久久av| 一本大道av一区二区在线播放| 国产精品色婷婷| 成人丝袜视频网| 国产精品美女久久福利网站| www.亚洲色图.com| 亚洲欧美激情视频在线观看一区二区三区| 国产成+人+日韩+欧美+亚洲| 国产欧美在线观看一区| 国产盗摄一区二区三区| 国产又粗又猛又爽又黄91精品| 欧美一级二级在线观看| 蜜桃在线一区二区三区| 欧美一级日韩免费不卡| 久久超碰97人人做人人爱| 精品剧情v国产在线观看在线| 紧缚捆绑精品一区二区| 久久免费精品国产久精品久久久久| 激情综合色综合久久综合| 2020国产精品自拍| 国产91色综合久久免费分享| 国产精品色呦呦| 色综合激情久久| 天堂在线一区二区| 欧美电视剧免费全集观看| 国产高清亚洲一区| 亚洲欧洲性图库| 欧美专区亚洲专区| 秋霞成人午夜伦在线观看| 精品国产伦一区二区三区观看方式 | 欧美日韩五月天| 日韩精品福利网| 日韩你懂的在线播放| 国产尤物一区二区| **欧美大码日韩| 欧美绝品在线观看成人午夜影视| 蜜臀久久久99精品久久久久久| 欧美精品一区二区三区四区 | 免费人成精品欧美精品| 精品免费国产一区二区三区四区| 国产乱人伦偷精品视频不卡| 国产精品视频九色porn| 欧美日韩在线播放一区| 久久国产综合精品| 自拍偷在线精品自拍偷无码专区| 欧美日韩亚洲综合一区二区三区| 美国三级日本三级久久99| 中文字幕乱码一区二区免费| 在线视频一区二区三区| 久久精品国产一区二区| 国产精品久久久久久久久果冻传媒| 91福利精品第一导航| 久草中文综合在线| 国产精品成人免费| 91麻豆精品国产91久久久久久久久| 国产东北露脸精品视频| 亚洲aaa精品| 中文av字幕一区| 欧美日韩国产a| 高清av一区二区| 午夜亚洲国产au精品一区二区| 久久精品免费在线观看| 欧亚洲嫩模精品一区三区| 极品尤物av久久免费看| 亚洲国产综合在线| 久久精品人人做人人爽人人| 欧美日韩一区二区三区不卡| 国产精品99久久不卡二区| 亚洲成人av中文| 日本一区二区在线不卡| 欧美精品自拍偷拍| 中文字幕国产一区| 欧美美女喷水视频| 成人av网址在线| 免费成人结看片| 一区二区三区不卡视频在线观看| 久久一日本道色综合| 欧美在线free| 成人免费高清视频在线观看| 日本女优在线视频一区二区| 亚洲男同1069视频| 久久久亚洲欧洲日产国码αv| 678五月天丁香亚洲综合网| 99在线精品一区二区三区| 久久成人免费电影| 亚洲v精品v日韩v欧美v专区| 国产精品毛片大码女人| 欧美精品一区二区在线观看| 欧美美女直播网站| 91偷拍与自偷拍精品| 国产精品18久久久久久久久久久久| 午夜精品久久久久久不卡8050| 中文字幕欧美一区| 国产日产亚洲精品系列| 欧美成人一区二区三区片免费 | 8x8x8国产精品| 在线精品视频一区二区| 国产成人综合网站| 久久精品国产亚洲aⅴ| 亚洲图片一区二区| 一区二区三区欧美在线观看| 亚洲国产经典视频| 国产夜色精品一区二区av| 欧美成人午夜电影| 这里是久久伊人| 欧美电影在线免费观看| 欧美亚洲一区二区在线观看| caoporn国产精品| 丰满白嫩尤物一区二区| 国产一区二三区好的| 久久www免费人成看片高清| 婷婷久久综合九色国产成人| 亚洲一区二区视频在线观看| 亚洲精品中文字幕乱码三区| 亚洲色图19p| 国产精品久久久99| 国产精品久久久久7777按摩| 国产精品久99| 中文字幕一区二区视频| 国产精品美女一区二区三区| 中文字幕欧美日韩一区| 国产精品私人自拍| 国产精品久久久久久久午夜片 | 日韩欧美中文字幕精品| 欧美一区二区免费视频| 91精品国产aⅴ一区二区| 欧美高清精品3d| 欧美一区二区免费观在线| 欧美成人性福生活免费看| 精品三级av在线| 久久精品视频一区| 国产精品久久久久久久午夜片 | 国产欧美一区在线| 国产精品乱码一区二三区小蝌蚪| 国产精品久久久久影院色老大 | 久久色视频免费观看| 久久久综合精品| 中文字幕不卡的av| 亚洲人成人一区二区在线观看| 亚洲伦理在线精品| 午夜久久久久久久久| 美腿丝袜亚洲一区| 激情深爱一区二区| 成人在线视频一区| 一本大道久久精品懂色aⅴ| 精品视频在线免费| 日韩一区二区三区在线| 精品va天堂亚洲国产| 国产日韩av一区二区| 亚洲激情av在线| 日韩中文字幕av电影| 精品综合免费视频观看| 成人免费高清视频| 欧美亚洲综合色| 精品国产乱子伦一区| 国产精品久久久久一区| 亚洲永久免费av| 另类小说色综合网站| 成人午夜视频免费看| 在线观看精品一区| 欧美电影免费观看高清完整版在 | 国产人久久人人人人爽| 亚洲美女电影在线| 奇米精品一区二区三区在线观看| 国产激情一区二区三区桃花岛亚洲|