抄书笔记-汇编语言 第七章 更灵活的定位内存地址的方法

前面主要是使用[0],[bx]等方式来定位内存地址,本章将介绍更加详细的方法。

7.1 and和or指令

(1)and指令:逻辑与指令,按位进行与运算,通过该指令可以将操作对象的相应为设置为0,其他位不变

mov al,01100011b

and al,00111011b

执行后:al=00100011b

(2)or指令:逻辑或运算,按位进行或运算,通过该指令可以将操作对象的相应位设置为1,其他位不变

mov al,01100011b

add al,00111011b

执行之后:al=01111011b

7.2关于ascll码

在计算机中,所有的信息都是二进制的,但是我们需要看到的信息却是字符形式的,这就需要一套编码规则来进行字符之间的转化,世界有很多的编码规则,ascll码只是其中一个规则。

比如在ascll码中,使用61H表示a,62H表示b

我们在键盘上面按下一个a,在显示器上面显示的过程:

按下键盘a,这个按键的信息被送入计算机,计算机用ascll码的规则对其进行编码,将其转化为61H存储在内存指定的空间中,文本编辑器软件从内存中取出61H,将其送入到显卡的显存中,工作在文本模式下面的显卡,用ascll码的规则解释显存中的内容,ascll被当作是字符a,显卡驱动显示器,将字符a的图像画在屏幕上。

7.3以字符的形式给出的数据

比如:

assume cs:code,ds:data
data segment
    db 'unIX'
    db 'foRX'
data ends
code segment
    start:mov al,'a'
            mov bl,'b'
            mov ax,4c00h
            int 21h
code ends
end start

其中 db 'unIX'转化为"db 75H,6EH,49H,58H"等等。

7.4大小写转化问题

考虑下面代码,将第一个字符转化为大写,第二个字符转化为小写。

assume cs:codesg,ds:datasg
datasg segment
    db 'BaSiC'
    db 'iNfOrMaTiOn'
datasg end

codesg segment
    start:
codesg ends
end start

正常的逻辑是判断该字符是大写的还是小写的,让后将大写的+20H转化为小写,将小写-20H转化为大写,但是暂时没有学习判断的语句,通过观察,大小写的区别是第五位是不是1,所以可以使用and和or语句。

实现程序如下:

assume cs:codesg,ds:datasg
datasg segment
    db 'BaSic'
    db 'iNfOrMaTiOn'
datasg ends

codesg
segment
    start:mov ax,datasg
            mov ds,ax
            mov bx,0
            mov cx,5
        s: mov al,[bx]
            add al,11011111B ;将第五位变为0
            mov [bx],al
            inc bx
            loop s
            mov bx,5
            mov cx,11
        s0:mov al,[bx]
            or al,0010000B ;将第五位变为1
            mov [bx],al
            inc bx
            mov ax,4c00h
            int 21h
    codesg ends
end start

7.5[bx+idata]

前面我们使用[bx]来指明一个内存单元,还可以用一种更为灵活的方式来指明内存单元,[bx+idata]来表示一个内存单元,它的偏移地址是(bx)+idata(bx中的数值加上idata)

比如:

mov ax,[bx+200]

将一个内存单元的内容送入到ax中,这个内存单元的长度是2个字节,存放的一个字,偏移地址是bx中的值加上200,段地址在ds中

数字化描述为:(ax)=((ds)*16+(bx)+200)

该命令也可以写成下面的形式:

mov ax,[200+bx]
mov ax,200[bx]
mov ax,[bx].200

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

将下面的第一个数组转化为大写,第二个转化为小写

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

codesg segment
    start:
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
        
    s: mov al,[bx]
        add al,11011111B
        mov [bx],al
        mov al,[5+bx]
        or al,00100000B
        mov [5+bx],al
        inc bx
        loop s
        
        mov ax,4c00h
        int 21
codesg end
end start

可以发现,[bx+idata]的方式为高级语言的实现数据提供了更加便利的机制。

7.7si和di

注意:si和di不能分成两个单独的8位寄存器来使用。

si和di 的功能和bx比较相近

7.8[bx+si]和[bx+di]

[bx+si]和[bx+di]的方式相似,我们就说[bx+si]

[bx+si]用来表示一个内存单元,它的偏移地址为(bx)+(si),就是bx中的值加上si中的值。

指令 mov ax,[bx+si]含义

将一个内存单元的内容送入到ax,这个内存单元的长度是2,存放一个字,偏移地址为bx中的数值加上si中的数值,段地址在ds中。

7.9[bx+si+idata]和[bx+di+idata]

7.10不同寻址方式的灵活运用

  1. [idata]用一个常量来表示地址,用于直接定位一个内存单元
  2. [bx]用一个变量来表示内存单元,可用于间接定位寻址一个内存单元
  3. [bx+idata]用一个变量和常量来表示地址,可以用于在一个起始地址的基础上用变量间接定位一个内存单元
  4. [bx+si]用两个变量来表示地址
  5. [bx+si+idata]用两个变量和一个常量表示地址

共有 0 条评论

Top