⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 label.c

📁 Intel x86处理器的汇编器
💻 C
字号:
#include "a64-2.h"#include "label.h"extern unsigned long long current_pc;extern unsigned long line;/**********************************************/int is_label(char *s){	if (!s || (s[0] != '@')) 		return 0;					struct label_link *label_link = label_table;	while (label_link && !str_cmp(label_link->label->name, s))		label_link = label_link->next;	return (int)label_link;}void mount_label_table(char *s){	struct label_link *head_label_link = label_table;	struct label_struct *label = 		(struct label_struct *)a64_malloc(sizeof(struct label_struct));	label->name = (char *)a64_malloc(str_len(s)+1);	strcpy(label->name, s);	label->addr = current_pc;	label->line = line;	struct label_link *label_link_node = 		(struct label_link *)a64_malloc(sizeof(struct label_link));	label_link_node->label = label;			if (!head_label_link) {		label_table = label_link_node;	} else {		while (head_label_link && head_label_link->next)				head_label_link = head_label_link->next;		head_label_link->next = label_link_node;	}}#if 0struct token_link *found_label(char *buf){	char str[80];	int i = 0;	int line = 1;	char *p = buf;	char *q;	struct token_link *tlk = 0;	while (*buf) {		if (*buf == '\n')			line++;		else if (*buf == ':') {			q = buf - 1;			while ((*q != ' ') && (*q != '\n') && (q >= p)) 				 q--;			q++;			while (q < buf) 				str[i++] = *q++;						str[i] = 0;			if (i == 0) {				buf++; continue;			}			if (is_valid_sym(str)) {				struct token *t = get_token();				t->name = (char *)malloc(i);				strcpy(t->name, str);				t->line = line;								struct token_link *tk = (struct token_link *)					malloc(sizeof(struct token_link));				memset(tk, 0, sizeof(tk));				tk->token = t;				if (tlk) {					for (; tlk->next; tlk = tlk->next);					tlk->next = tk;				} else					tlk = tk;			}		}		i = 0;			buf++;	}			return tlk;}#endifvoid mount_hole_link(char *label, i_key_t *i_key){	struct transfer_hole_struct *hpos = (struct transfer_hole_struct *)			a64_malloc(sizeof(struct transfer_hole_struct));	struct transfer_hole_struct *head_hpos = hole_link;	hpos->hole_label = a64_malloc(str_len(label) + 1);	strcpy(hpos->hole_label, label);	hpos->hole_i_key = i_key;	hpos->hole_addr = current_pc;	hpos->hole_line = line;	hpos->bits = current_bits;		if (!hole_link) {		hole_link = hpos;	} else {		while (head_hpos->next) 			head_hpos = head_hpos->next;		head_hpos->next = hpos;	}}struct label_link *get_label_node(char *label){	struct label_link *head_ll = label_table;		while (head_ll && !str_cmp(head_ll->label->name, label))		head_ll = head_ll->next;		return head_ll;}unsigned long long get_label_addr(char *label){	struct label_link *head_ll = label_table;		while (head_ll && !str_cmp(head_ll->label->name, label)) 		head_ll = head_ll->next;		return head_ll ? head_ll->label->addr : 0;}void print_label_table(){	struct label_link *lt = label_table;	while (lt) {		printf("label: %s ", lt->label->name);		printf("addr: %x ", lt->label->addr);		printf("line: %d\n", lt->label->line);		lt= lt->next;	}}void print_hole_link(){	struct transfer_hole_struct *hl = hole_link;	while (hl) {		printf("hole label: %s ", hl->hole_label);		printf("hole line: %d ", hl->hole_line);		printf("hole addr: %x ", hl->hole_addr);		printf("hole size: %d\n", hl->hole_size);		hl = hl->next;	}}/**************************************************************************/static void release_hole_struct(struct transfer_hole_struct *hole_struct){	if (hole_struct) {		if (hole_struct->hole_label)			a64_free(hole_struct->hole_label);					a64_free(hole_struct);	}}static void release_label_struct(struct label_struct *label_struct){	if (label_struct) {		if (label_struct->name)			a64_free(label_struct->name);				a64_free(label_struct);	}}void release_hole_link(){	struct transfer_hole_struct *hole_next  = 0;	while (hole_link) {		hole_next = hole_link->next;		release_hole_struct(hole_link);		hole_link = hole_next;		}}void release_label_table(){	struct label_link *label_next;		while (label_table) {		label_next = label_table->next;		release_label_struct(label_table->label);		a64_free(label_table);		label_table = label_next;	}}/*main(){	char buf[80];	int fd = open("string.s",O_RDONLY);	struct iob iob;	init_iob(fd, &iob);	while (read_into_iob(&iob,1024))	while (read_from_iob(&iob, buf, 80)) {	struct token_link *tk = found_label(buf);	while (tk) {		printf("%s:%d\n", tk->token->name, tk->token->line);		tk = tk->next;	}}}*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -