/* 以下程序实现的功能为对于输入的任意一个非负十进制整数,打印输出与其等值的八进制数 */
最后main函数里要填什么?
#include
#include
#include
#include
#include
#include
#include
#include /* exit() */
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int Boolean;
typedef int SElemType;
/*栈的顺序存储表示 */
#define STACK_INIT_SIZE 10
#define STACKINCREMENT 2
typedef struct
{
SElemType *base;
SElemType *top;
int stacksize; //填写语句
}SqStack;
Status InitStack(SqStack *S) //初始化顺序栈
{
(*S).base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!(*S).base) exit(OVERFLOW);
(*S).top=(*S).base;
(*S).stacksize=STACK_INIT_SIZE;
return OK;
}
Status DestroyStack(SqStack *S)
{
free((*S).base);
(*S).base=NULL;
(*S).top=NULL;
(*S).stacksize=0;
return OK;
}
Status ClearStack(SqStack *S)
{
S->top = S->base; //填写一条语句
return OK;
}
Status StackEmpty(SqStack S)
{
if(S.top==S.base||S.top//括号内补充完整
return TRUE;
else
return FALSE;
}
int StackLength(SqStack S)
{
return S.top-S.base;
}
Status GetTop(SqStack S,SElemType *e)
{
if(S.top>S.base)
{
*e=*(S.top-1);
return OK;
}
else
return ERROR;
}
Status Push(SqStack *S,SElemType e)
{
if((*S).top-(*S).base >= (*S).stacksize) //补充完整判断条件表达式
{
(*S).base = (SElemType *)realloc ((*S).base,((*S).stacksize + STACKINCREMENT)*sizeof(SElemType)); //填写一条语句
if(!(*S).base)
exit(OVERFLOW);
(*S).top= (*S).base + (*S).stacksize;
(*S).stacksize +=STACKINCREMENT; //填写两条语句
}
*((*S).top)++=e;
return OK;
}
Status Pop(SqStack *S,SElemType *e)
{
if((*S).top==(*S).base ) //补充完整判断条件表达式
return ERROR;
*e=*--(*S).top;
return OK;
}
void conversion() /* 算法3.1 */
{
SqStack s;
unsigned n;
SElemType e;
InitStack(&s);
printf("n(>=0)=");
scanf("%u",&n);
while(n)
{
Push(&s,n%8); //填写一条语句
n=n/8;
}
while(!StackEmpty(s))
{
Pop(&s,e); //填写一条语句
printf("%d",e);
}
printf("\n");
}
main()
{
//填写一条语句
getch();
}
conversion();
由于__main 是编译器自带的库函数很难找到源码,如果你懂汇编就能很清楚知道这个问题。我们通过fromelf工具获取到汇编文件,参考日下图的文章进行操作。
这类给一个典型的操作方式,鼓励大家从参考的文档中找到方法,鼓励培养英文的阅读能力。
我们在看看具体的汇编代码:
从大的轮廓能看到__main 函数是完成了,主栈指针的初始化,全局变量的初始化(典型的是把RW变量搬到ram,把ZI段在RAM初始为零),然后跳转的main函数,由于这块内容比较多,我着重解析如几点:
1、主栈的指针是存放在0地址,为什么软件读取主栈指针不从0地址读取呢?
原因:0地址的内容和软件读取的0x364的内容是一样的,为什么这样做还不知道。
2、下图是main函数地址,上图第三步跳转的是0xa92d,实际的main函数是0xa92c。
原因:thumb 指令需要最低为1,区分thumb 指令和arm 指令,实际执行的时候减一。