通过汇编寻址方式修改数据

比如说有这么一条记录

这里写图片描述

这些数据在内存中存放的位置如下所示

这里写图片描述

如果这个时候这个公司的情况发生了改变,情况如下所示

这里写图片描述

这个时候我们需要去对这些数据利用汇编指令进行修改,我们可以这么做

mov ax,seg
mov ds,ax
mov bx,60h ;确定了记录的地址 ds:bx

mov word ptr [bx+0ch],38
add word ptr [bx+0eh],70

mov si,0
mov byte ptr [bx+10h+si],'V'
inc si
mov byte ptr [bx+10h+si],'A'
inc si
mov byte ptr [bx+10h+si],'X'

其实如果用C语言来描述这个程序的话,可以是这样的,其实我觉得这个真的是理解这个构造的一个很好的方式

struct company {  //公司记录的结构体
     char cn[3];  //公司名称
     char pn[9];  //总裁姓名
     int pm;      //排名
     int sl;      //收入
     char cp[3];  //著名产品
};
//定义一条公司的记录,也就是说内存当中是有了一条公司的记录
struct company dec = {"DEC","Ken Olsen",137,40,"PDP"};
main()
{
int i;
dec.pm=38;
dec.sl=dec.sl+70;
i=0;
dec.cp[i]='V';
i++;
dec.cp[i]='A';
i++;
dec.cp[i]='X';
return 0;
}

如果再按照C语言的方式,用8086汇编去编写一下程序,我们会发现8086CPU提供的[bx+si+idata]的寻址方式为结构化数据的处理提供了很好的方式,比如说我们可以用[bx+idata+si]的方式去访问结构体当中的数据,可以用bx去定位一整个结构体,用idata去定位结构体当中的某一个数据项,用si去定位数组项当中的每一个元素

mov ax,seg
mov ds,ax
mov bx,60h  ;把首地址放到bx

mov word ptr [bx].0ch,38 ;将排名的字段改为38即dec.pm=38;
add word ptr [bx].0eh,70 ;收入的字段加70即dec.sl = dec.sl+70;

mov si,0  ;相当于 i=0;
mov byte ptr [bx].10h[si],'V' ;修改字符串的值dec.cp[i]='V';
inc si ;i++
mov byte ptr [bx].10h[si],'A' ;dec.cp[i]='A';
inc si ; i++;
mov byte ptr [bx].10h[si],'X' ; dec.cp[i]='X'

其实在C语言程序当中,dec.cp[i],dec是一个变量名,其实就是指的是结构体变量的地址,cp也是一个名词,指的其实就是数据项cp的地址,而i则是用来定位cp当中的每一个字符,所以汇编当中就使用bx.10h[si]

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值