交换两数的伪汇编代码

本文介绍了在32位模式环境中,如何使用伪汇编指令交换两个变量的数据。通过具体的内存分配和寄存器操作,详细解析了避免溢出问题的交换过程,确保数据正确交换而不影响相邻内存区域。
最近很想学低层的知识,但是又找不到适合的书籍,除了汇编(考试不及格),像那种深度探索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 <swap>
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;也是如此

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值