曲曲的秘密学术基地

纯化欲望、坚持严肃性

欢迎!我是曲泽慧(@zququ),目前在深圳(ICBI,BCBDI,SIAT)任职助理研究员。


病毒学、免疫学及结构生物学背景,可以在 RG 上找到我已发表的论文

本站自2019年7月已访问web counter

汇编语言 8.6 寻址方式的综合应用

8.6 寻址方式的综合应用

按照王爽教材里给的例子:

公司名称 DEC
总裁姓名 Ken Olsen
排名 137
收入 40
著名产品 PDP

以上是DEC公司1982年的情况,到了1988年DEC公司的信息放生了变化,如下:

公司名称 DEC
总裁姓名 Ken Olsen
排名 38
收入 +70
著名产品 VAX

利用汇编语言来对对应数据进行修改。

figure1

代码如下:

mov ax, seg  ;seg:60
mov ds, ax
mov bx, 60h  ;设置seg的偏移地址

mov word ptr [bx+0Ch], 38
add word ptr [bx+0Eh], 70

mov si, 0
mov byte ptr [bx+10h+si], 'V'  ;字符串占用3个字节
inc si
mov byte ptr [bx+10h+si], 'A'
inc si
mov byte prt [bx+10h_si], 'X'

观察相同功能的C语言代码:

struct company {    /*定义公司记录的结构体*/
    char cn[3];     /*公司名称*/
    char hn[9];     /*总裁姓名*/
    int  pm;        /*排    名*/
    int  sr;        /*收    入*/
    char cp[3];     /*注明产品*/
    };
struct company dec={"DEC", "Ken Olsen", 137, 40, "PDP"};
/*定义一个公司记录的变量,内存中将存有一条公司的记录*/
main()
{
 int i;
 dec.pm=38;
 dec.sr=dec.sr+70;
 i=0;
 dec.cp[i]='V';
 i++;
 dec.cp[i]='A';
 i++;
 dec.cp[i]='x';
 return 0;
}

对应C语言风格,将汇编语言代码进行改写:

mov ax, seg
mov ds, ax
mov bx, 60h
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'

从这个例子看,有几个收获与结论:

  1. 我们再编程的时候,从结构化的角度去看待所要处理的数据。
  2. 一个结构化的数据包含了多个数据项。
  3. 8086CPU提供的[bx+si+idata]的寻址方式为结构化数据的处理提供了方便。
  4. **我们可以用[bx+idata+si]的方式来访问结构体中的数据。用bx定位整体结构体,用idata定位结构体中的某一个数据项,用si定位数组项中的每一个元素。为此,汇编语言提供了更贴切的书写方式,[bx].idata[bx].idata[si]

对比C语言和汇编语言代码,我们可以看到,如dec.cp[i]与汇编语言的bx.10h[si]是很相似的。

Last One

C语言 简介以及C转化asm的初尝试

整理自小甲鱼鱼C论坛编译的概念将助记符转化为机器码的过程叫做编译。C语言的优势(1) 效率高C语言相对于其他第三代编程语言,C语言是编译型语言,源代码最终编译为机器语言,也就是可执行文件,从此CPU就可以直接执行。编译型语言与解释型语言的对比: C语言 Python 汇编语言 字节码 机器语言 解释器 CPU执行 CPU执行 (2) ...…

C语言More
Next One

python 魔方方法 (1) 构造与析构

整理自小甲鱼鱼C论坛构造与析构__init__(self[,...])__init__()相当于其他面向对象编程语言的构造方法,也就是类在实例化成对象时,首先会调用的方法。class Rectangle: def __init__(self, x, y): self.x = x self.y = y def getArea(self): return self.x * self.y>>> rect = Rectangl...…

pythonMore