




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第17章简单汇编语言解释器
——代码阅读与测试驱动编程6A0172011.12.30早期的计算机11011001101100111100111010010000机器语言NOP10010000汇编语言NOPnopmovah2movdl69int21int20汇编语言示例EX1.ASMmovah2movdl69int21int20寄存器AHDL调用系统函数int21ah=2输出DL寄存器中的字符int20中止程序并退出mov指令movregdata将数据data存入reg///汇编指令节点(链表)///每个节点最多存储“命令”,“操作数1”,“操作数2”等三部分信息structstatement{charcmd[9],op1[9],op2[9];//movregdata...statement*next;};///寄存器名字列表char*reg_name[]={"data","ah","dl"};///CPU中的部分寄存器。初值设为0.intreg[]={0,0,0};
//DATA,AH,DL///为方便编写程序来执行汇编代码,定义枚举类型作为数组下标。enumIDX{DATA,AH,DL};数据结构设计intmain(){charasm_file[20];cout<<"PleaseinputASMsrcfile:"; cin>>asm_file;
///<1>读入代码statement*head=read_src(asm_file);
///<2>显示代码---用于调试,不是必须的
show_code(head);
///<3>执行代码
run_code(head);
///<4>释放内存
release(head);
///<5>结束运行,显示信息cout<<endl<<"programendnormally."<<endl;
return0;}测试驱动编程的设计思想先写测试代码///释放所有链表节点占用的内存voidrelease(statement*head){ statement*p=head; while(p){ head=p->next;
deletep; p=head; }}///从指定汇编程序源文件中读取代码,返回代码链表。statement*read_src(char*file){ statement*head=NULL,*tail=NULL;
ifstreamf(file);while(f){
//createanewnodeforcurrentstatement statement*p=newstatement; f>>p->cmd;
//weshouldcheckfilestatushere! if(f.eof()){
deletep; break;//break-while }
seenextslide!
} f.close();
returnhead;}
switch(p->cmd[0]){//根据首字母来判断是什么汇编指令 case'm'://movregdata f>>p->op1>>p->op2; break; case'i'://int#num f>>p->op1; break; } p->next=NULL;
//appendthenewnodetothelist if(tail){ tail->next=p; tail=p; }else{ head=tail=p; }///逐行显示所有代码。输出格式是规范后的结果。 voidshow_code(statement*head){statement*p=head;while(p){ cout<<"-->"<<p->cmd<<''<<p->op1; switch(p->cmd[0]){ case'm'://MOV cout<<''<<p->op2<<endl; break; case'i'://INT#NUM cout<<endl; break;
} p=p->next;}}///按指令链表内容顺序,逐一解释执行汇编指令。voidrun_code(statement*head){boolbExit=false;statement*p=head;while(!bExit&&p){
seenextslide!
p=p->next;}//_WHILE_} intop2_idx; switch(p->cmd[0]){///分不同指令,执行不同的动作 case'm'://MOVREGDATA op2_idx=reg_index(p->op2); reg[reg_index(p->op1)]=atoh(p->op2); break;
case'i'://INT21,INT20 switch(atoi(p->op1)){ case21: switch(reg[AH]){ case2://outputchar cout<<char(reg[DL]); break; } break; case20: bExit=true; break; } }///根据寄存器名,查找它对应于reg数组的下标位置。///0表示没有找到。intreg_index(char*r){
for(inti=sizeof(reg)/sizeof(reg[0])-1;i>=0;--i){//请留意下面的编程技巧 if(strcmp(reg_name[i],r)==0) returni;}return0;}//stringinHEXtointintatoh(char*str){ intlen=strlen(str); intsum=0; for(inti=0;i<len;i++){ sum<<=4; sum+=(isdigit(str[i])?(str[i]-'0'):(str[i]-'a'+10)); } returnsum;}EX2.ASMmovah1int21movdlalmovah2int21int20
调用系统函数int21ah=1从键盘输入一个字符存放到DL中mov指令movreg1reg2
把寄存器reg2的值复制到reg1中EX2B.ASMmovcx4movdl43movah2again:int21loopagainint20
寄存器CX
标号label:loop指令looplabel如寄存器CX大于零,则将CX减1,并跳转到label行重复执行。EX2C.ASMmovcx4movdl34movah2again:int21incdlloopagainint20inc指令increg将寄存器reg内容加1EX2D.ASMmovcx4movdl43movah2again:int21decdlloopagainint20dec指令decreg将寄存器reg内容减1EX2E.ASMmovcx4movdl43movah2again:int21adddl3loopagainint20add指令addregdata将寄存器reg内容加dataEX2F.ASMmovcx4movdl4amovah2again:int21subdl3loopagainint20sub指令subregdata将寄存器reg内容减dataEX3B.ASMmovcx4fmovdl41again:movah2int21jmpnextloopagainnext:int20jmp指令jmplabel程序转到label行执行EX4.ASM;DATA:HEXFORMAT! movbh8 movcx24 movah2 movdl22again:int21
incdldecbhjnznextmovdhdlmovdlaint21movdldhmovbh8next:loopagain int20
注释行;
缩进格式
寄存器BH,DH
条件跳转指令jg大于则跳转jl小于则跳转je等于则跳转jne不等于则跳转jz为零则跳转jnz不为零则跳转jnzlabelEX5.ASM;2^nsequencemovcx7movah3moval1movdl1next:int21adddlalmovaldlloopnextint20add指令addreg1reg2两个寄存器内容相加,结果放到reg1中。
调用系统函数int21ah=3输出DL寄存器中的数值EX6.ASM;Fibonacci
numbersmovcx7movah3movbh0movbl1next:movdlbhint21movbhbladdbldlloopnextint20阅读并理解示例源程序
找出剩余的
#include<iostream>//cin,cout#include<fstream>//ifstreamusingnamespacestd;///汇编指令节点(链表)///每个节点最多存储“命令”,“操作数1”,“操作数2”等三部分信息structstatement{charcmd[9],op1[9],op2[9];//1.movregreg2.movregdata//bug_6:op1[3],op2[3]statement*next;};///CPU中的部分寄存器。初值设为0.intreg[]={0,0,0,0,0,0,0,0,0,0};//see"reg_name"inreg_index(..)///为方便编写程序来执行汇编代码,定义枚举类型作为数组下标。enumIDX{DATA,AH,AL,BH,BL,DH,DL,CX,ZF,SF};//bug_7BH,BLmissed.///根据寄存器名,查找它对应于reg数组的下标位置。0表示没有找到。intreg_index(char*r){char*reg_name[]={"data","ah","al","bh","bl","dh","dl","cx","ZF","SF"};
for(inti=sizeof(reg)/sizeof(reg[0])-1;i>=0;--i){//notethisskillif(strcmp(reg_name[i],r)==0)returni;}return0;}///调试时打印出CPU中各寄存器的值。voidshow_reg(){for(inti=1;i<sizeof(reg)/sizeof(reg[0]);++i)cout<<reg[i]<<'';cout<<endl;}
///从指定汇编程序源文件中读取代码,返回代码链表。statement*read_src(char*file){statement*head=NULL,*tail=NULL;
ifstreamf;f.open(file);while(f){//createanewnodeforcurrentstatementstatement*p=newstatement;f>>p->cmd;if(p->cmd[0]==';')//如果这一行是分号开头,表示是注释行,要跳过此行。{ //method1// f.ignore(numeric_limits<std::streamsize>::max(),'\n');
//pp609in"TheC++StandardLibrary"
//method2 charline[80]; f.getline(line,80);
//pp608in"TheC++StandardLibrary" deletep; continue;//skipcurrentline(comment)}
//weshouldcheckfilestatushere!if(f.eof()){deletep;break;//while}
//检查是否是标号行(这一行没有汇编语句)if(p->cmd[strlen(p->cmd)-1]==':'){//label:p->cmd[strlen(p->cmd)-1]='\0';//remove':'strcpy(p->op1,":");}else{switch(p->cmd[0]){//根据首字母来判断是什么汇编指令case'm'://movreg1reg2,movregdatacase'a'://addreg1reg2,addregdatacase's'://subreg1reg2,subregdataf>>p->op1>>p->op2;break;case'i'://intnum,orincregcase'd'://decregcase'l'://looplabelcase'j'://jmplabel,jz,je,jnz,jne,jl,jgf>>p->op1;break;}}p->next=NULL;
//appendthenewnodetothelistif(tail){tail->next=p;tail=p;}else{head=tail=p;}}f.close();
returnhead;}///释放所有链表节点占用的内存voidrelease(statement*head){statement*p=head;while(p){head=p->next;deletep;p=head;}}///在汇编程序代码中查找标号所在的“行”,返回存放标号的节点指针。///没有找到,则返回NULLstatement*find_label(statement*head,char*label){while(head){if(strcmp(head->cmd,label)==0)returnhead;elsehead=head->next;}returnNULL;//bug_3}///逐行显示所有代码。输出格式是规范后的结果。 voidshow_code(statement*head){statement*p=head;while(p){cout<<"-->"<<p->cmd<<''<<p->op1;if(p->op1[0]==':'){cout<<endl;p=p->next;continue;}switch(p->cmd[0]){case'm'://MOVcase'a'://ADDcase's'://SUBcout<<''<<p->op2<<endl;break;case'i'://INTNUM,INCREGcase'l'://LOOPLABELcase'd'://DECREGcase'j'://JMPLABEL,JG,JL,JE,JZ,JNE,JNZcout<<endl;break;}p=p->next;}}//stringinHEXtointintatoh(char*str){intlen=strlen(str);intsum=0;for(inti=0;i<len;i++){sum<<=4;//bug_4sum+=(isdigit(str[i])?(str[i]-'0'):(str[i]-'a'+10));}returnsum;}///按指令链表的内容顺序,逐一解释执行汇编指令。voidrun_code(statement*head){statement*p=head;while(p){#if0//[debug] cout<<p->cmd<<''<<p->op1<<''<<p->op2<<endl;show_reg();charpause;cin>>pause;#endif///这一行是标号吗?是则转到下一指令if(p->op1[0]==':'){//shouldbecheckedatfirstp=p->next;continue;}
///分不同指令,执行不同的动作intop2_idx;switch(p->cmd[0]){case'm'://MOVop2_idx=reg_index(p->op2);if(op2_idx==0)//op2isNOTareg!reg[reg_index(p->op1)]=atoh(p->op2);//atoi(p->op2);elsereg[reg_index(p->op1)]=reg[op2_idx];break;
case'a'://ADDop2_idx=reg_index(p->op2);if(op2_idx==0)//op2isNOTareg!reg[reg_index(p->op1)]+=atoh(p->op2);//atoi(p->op2);elsereg[reg_index(p->op1)]+=reg[op2_idx];break;case's'://SUBop2_idx=reg_index(p->op2);if(op2_idx==0)//op2isNOTareg!reg[reg_index(p->op1)]-=atoh(p->op2);//atoi(p->op2);elsereg[reg_index(p->op1)]-=reg[op2_idx];///设置标志寄存器中的相应位if(reg[reg_index(p->op1)]>0)reg[ZF]=0,reg[SF]=0;elseif(reg[reg_index(p->op1)]<0)reg[ZF]=0,reg[SF]=1;elsereg[ZF]=1,reg[SF]=0;break;case'i'://INT21,INT20,INCREGif(reg_index(p->op1)){//INCREGreg[reg_index(p->op1)]++;}else{switch(atoi(p->op1)){case21: switch(reg[AH]){ case1: charch; cin>>ch; reg[AL]=int(ch); break; case2://outputchar cout<<char(reg[DL]); break; case3://outputvalue cout<<reg[DL]<<'';//addaspacetoseparatenumbers break; } break;//bug_2(missed)
case20: release(head); break;// exit(0);//bug_5}}//if_elsebreak;
case'l'://LOOP//lookforthelabel(p->op1)inthecode-listreg[CX]--;if(reg[CX])p=find_label(head,p->op1);break;
case'j':if((strcmp(p->cmd,"jmp")==0)||//JMPLABEL((strcmp(p->cmd,"jg")==0)&&(reg[ZF]==0)&&(reg[SF]==0))||((strcmp(p->cmd,"jl")==0)&&(reg[ZF]==0)&&(reg[SF]==1))||((strcmp(p->cmd,"je")==0
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030中国锂电池隔膜行业市场发展分析及发展前景预测研究报告
- 2025-2030中国重卡变速箱行业发展趋势与投资风险预测报告
- 2025-2030中国道路应急救援行业发展格局与需求潜力分析研究报告
- 2025-2030中国连续流搅拌釜反应器(CSTR)行业市场发展趋势与前景展望战略研究报告
- 2025-2030中国轮胎起重机行业市场深度调研及价值评估与投资前景研究报告
- 2025-2030中国轧钢棒材行业市场发展趋势与前景展望战略研究报告
- 2025年金属压力及大型容器合作协议书
- 2025-2030中国贸易信息化行业市场发展现状及竞争策略与投资发展研究报告
- 2025-2030中国豪华睡袍行业市场发展趋势与前景展望战略研究报告
- 2025-2030中国调味乳行业市场现状供需分析及重点企业投资评估规划分析研究报告
- 2025年河南水利与环境职业学院单招职业倾向性测试题库学生专用
- 2025年人体捐献协议
- 《急性阑尾炎幻灯》课件
- 员工黄赌毒法制培训
- 广东省广州市番禺区2023-2024学年八年级上学期期末英语试题(答案)
- 高中化学基础知识超级判断300题
- 邮政储蓄银行的2024年度借款合同范本
- 汽车吊起重吊装方案
- 从0到1开播指导抖音本地生活商家直播培训
- 产房助产士进修汇报
- 大型综合楼新建工程技术方案、施工方案投标文件(投标方案)
评论
0/150
提交评论