交换两数的伪汇编代码

最近很想学低层的知识,但是又找不到适合的书籍,除了汇编(考试不及格),像那种深度探索CPP对象模型那样的书不知道还有什么。
后来在看那个斯坦福大学的编程范式的公开课,学到了点东西。估计大家都知道。。
 
void foo()        
{
    int x;
    int y;
    x=11;
    y=17;
    swap(&x,&y);

assembly code:
sp=sp-8;
M[sp+4]=11;
M[sp]=17;
R1=sp;
R2=sp+4;
sp=sp-8;
M[sp]=R2;
M[sp+4]=R1;
call
sp=sp+8;
sp=sp+8;
ret;

void swap(int *ap,int *bp)
{
    int temp=*ap;
    *ap=*bp;
    *bp=temp;
}

assemly code:
//  int temp=*ap;
sp=sp-4;
R1=[sp+8];
R2=M[R1];
M[sp]=R2;

//  *ap=*bp;
R1=M[sp+12];
R2= M[R1];
R3= M[sp+8];
M[R3]=R2;

// *bp=temp;
R1=M[sp];
R2=M[sp+12];
M[R2]=R1;

sp=sp+4;
ret;
 
 
 
另:

//在32位模式的环境中

// data1,sdata1,sdata2 in stack segment

int data1=200;

short sdata1;

short sdata2;

 

//size;

sizeof(data1)=4bytes;

sizeof(sdata1)=sizeof(sdata2)=2 bytes;

 

抽象内存分配:           

data1

sdata1

sdata2

        

sdata1=data1+1;

伪汇编指令为:R2=M[R1+4]  //load    

              R3=R2+1//add

              M[R1+2]=.2R3 // store

in stack,地址由高往低增长,取data1故用R1基址+4取4个bytes的内容即200于register R2

M[R1+2]=.2R3 为取R3中低两个bytes内容于M[R1+2]中,若M[R1+2]=R3,则因为R1+2表示sdata2地址,sdata2占两个bytes,则取出R3中4bytes(在32 位模式中)内容会覆盖sdata2的两个bytes和data1的高地址的两个bytes,那么data1不是200了,远远大于200,至于多少则应换成对应的二进制位算…..位模式

sdata2=data1;也是如此

你可能感兴趣的:(交换两数的伪汇编代码)