曲曲的秘密学术基地

纯化欲望、坚持严肃性

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


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

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

汇编语言 7.5 7.6 通过[bx+idata]进行数组处理

7.5 [bx+idata]

例如我们要访问地址[10H], 可以进行如下变换:

$$[bx=10H]=[bx=8H+2H]$$

[bx+idata]表示一个内存单元,它的偏移地址为(bx)+idata (bx中的数值加上idata)。

将这种操作代入指令中,如mov ax, [bx+200],含义为:

$$(ax)=((ds)*16+(bx)+200)$$

[bx+idata]的形式有多种方法,如下等同:

  1. mov ax, [200+bx]
  2. mov ax, 200[bx]
  3. mov ax, [bx].200

7.6 用[bx+idata]的方式进行数组的处理

首先复习一下上一篇博客中大小写字母转化的代码(非常重要):

assume cs:codesg, ds:datasg
datasg segment
  db 'BaSiC'
  db 'MinIX'
datasg ends

codesg segment
  start:  mov ax, datasg
          mov ds, ax

          mov bx, 0
          mov cx, 5
      s:  mov al, ds:[bx]
          and al, 11011111b
          mov ds:[bx], al
          inc bx
          loop s
          
          mov bx, 5
          mov cx, 5
     s0:  mov al, ds:[bx]
          or al, 00100000b
          mov ds:[bx], al
          inc bx
          loop s0

          mov ax, 4c00h
          int 21h

codesg ends
end start

利用[bx+idata]的方法对代码进行优化:

assume cs:codesg, ds:datasg
datasg segment
  db 'BaSiC'
  db 'MinIX'
datasg ends

codesg segment
  start:  mov ax, datasg
          mov ds, ax

          mov bx, 0
          mov cx, 5
      s:  mov al, ds:[bx]  ;定义第一个字符串中的字符
          and al, 11011111b
          mov ds:[bx], al  ;定义第二个字符串中的字符

          mov al, ds:[bx+5]
          or al, 00100000b
          mov ds:[bx+5], al

          inc bx
          loop s

codesg ends
end start

这里注意以下关系,并可以基于此对代码进行改写,代码完全等效:

$$0[bx]=[bx]=[bx].0=[bx+0]=[0+bx]$$

在C语言中也存在着相同的处理方式,如下代码:

char a[5]="BaSiC";
char b[5]="MinIX";

main()
{
  int i;
  i=0;
  do
  {
  a[i]=a[i]&0xDF;
  b[i]=b[i]|0x20;
  i++;
  }
  while(i<5);
}

其中,&含义与and相同,|含义与or相同。

C语言:a[i], b[i] 汇编语言:0[bx], 5[bx]

通过比较,我们可以发现,[bx+idata]的方式为高级语言实现数组提供了便利机制

Last One

Defocus in TEM Imaging.1 General

Relative information is summarised from the Online Book of the Practical Electron Microscopy and Database, in the next posts, I will only reference it in the end of the post.In TEM imaging, the conventional modes of high-resolution imaging are mai...…

cryo-EMMore
Next One

汇编语言 7.1 7.2 7.3 7.4 and or, ASCII, 按字符给出数据, 大小写转化

7.1 and和or指令and 指令mov al, 01100011Bmov al, 00111011B;结果为 al = 00100011B通过该指令可将操作对象的相应位设为0,其他不变。如将al的第六位设置为零的指令为:and al, 10111111Bor 指令mov al, 01100011Bor al, 00111011B;结果为 al = 01111011B通过该指令可将操作对象的相应位设置为1,其他位不变。如将al的第六位设置为1的指令为:or al, 09000000B7....…

汇编语言More