第七章 更灵活的定位内存地址的方法

第七章 更灵活的定位内存地址的方法

7.1 and和or指令

and指令:逻辑与指令,按位进行与运算。

mov al, 01100011B
and al, 00111011B

执行后:al=00100011B即都为1才为1

or指令:逻辑或指令,按位进行或运算。

mov al, 01100011B
or al, 00111011B

执行后:al=01111011B 即只要有一个为1就为1

7.2 关于ASCII码

世界上有很多编码方案,有一种方案叫做ASCII编码,是在计算机系统中通常被采用的。简单地说,所谓编码方案,就是一套规则,它约定了用什么样的信息来表示现实对象。比如说,在ASCII编码方案中,用61H表示“a”,62H表示“b”。一种规则需要人们遵守才有意义。

在文本编辑过程中,我们按一下键盘的a键,就会在屏幕上看到“a”。我们按下键盘的a键,这个按键的信息被送入计算机,计算机用ASCII码的规则对其进行编码,将其转化为61H存储在内存的指定空间中;文本编辑软件从内存中取出61H,将其送到显卡上的显存中;工作在文本模式下的显卡,用ASCII码的规则解释显存中的内容,

61H被当作字符“a”,显卡驱动显示器,将字符“a”的图像画在屏幕上。我们可以看到,显卡在处理文本信息的时候,是按照ASCII码的规则进行的。这也就是说,如果我们要想在显示器上看到“a”,就要给显卡提供“a”的ASCIⅡ码,61H。如何提供?当然是写入显存中。

7.3 以字符形式给出的数据

汇编程序中,’……'指明数据以字符形式给出的,编译器将把他们转化为相对应的ASCII码

;汇编程序的字符操作
assume cs:code,ds:data
data segment
    db 'unIX'
    db  'foRK'
data ends
code segment
start:  mov al,'a'
        mov bl,'b'
        mov ax,4c00h
        int 21h
code ends
end start

7.4 大小写转换的问题

A:65d 01000001

a:97d 01100001

and: 11011111

结果: 01000001

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]
        ; 如果(al)>61H,则为小写字母的ASCII码,则:sub al,20H
        and al,11011111b    ;小写变大写
        mov [bx],al
        inc bx
        loop s  

        mov bx,5
        mov cx,11
    s0:  mov al,[bx]
        or al,00100000b
        mov [bx],al
        inc bx
        loop s0

        mov ax,4c00h
        int 21h
codesg ends
end start

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

assume cs:codesg,ds:datasg
datasg segment
    db 'BaSiC'
    db 'MinIX'
datasg ends
codesg segment
start:  mov ax,datasg
        mov ds,datasg
        mov bx,0
        mov cx,5
    s:  mov al,[bx]
        add al,11011111b
        mov [bx],al

        mov al,[bx+5]
        mov al,5[bx]
        or al,00100000b
        mov [bx+5],al
        loop s
        mov ax,4c00h
        int 21h
codesg ends
end start

C语言版本

#include<stdio.h>
int main(){
    char a[5] = "BaSiC";
    char b[5] = "MinIX";
    int i = 0;
    do
    {
        a[i] = a[i] & 0xDF;
        b[i] = b[i] | 0x20;
        i++;
    } while (i < 5);
    printf("%s %s\n",a,b);
    getchar();
    return 0;
}

7.6 SI和DI

SI和DI是8086CPU中和bx功能相近的寄存器,且不能够分成两个8位寄存器来用

将 welcome to masm! 复制到datasg:10h~1fh

assume cs:codesg,ds:datasg
datasg segment
    db 'welcome to masm!';16位
    db '................'
datasg ends
codesg segment
start:  mov ax,datasg
        mov ds,ax
        mov bx,0
        mov cx,8
    s:  mov ax,[bx]
        mov [bx+16],ax
        ; inc bx
        add bx,2
        loop s
        mov ax,4c00h
        int 21h
codesg ends
end start

7.7 不同的寻址方式的灵活应用

深入理解下列几种寻址方式:

  • [idata]
  • [bx]
  • [bx+idata]
  • [bx+si]
  • [bx+si+idata]

[bx+idata]

; 将每一个单词的头一个字母改成大写字母
assume cs:codesg,ds:datasg
datasg segment
    db '1. file          '
    db '2. edit          '
    db '3. search        '
    db '4. view          '
    db '5. options       '
    db '6. help          '
datasg ends
codesg segment
start:  mov ax,datasg
        mov ds,ax
        mov bx,0
        mov cx,6
    s:  mov al,[3+bx]
        and al,11011111b
        mov [3+bx],al
        add bx,10h
        loop s
        mov ax,4c00h
        int 21h
codesg ends
end start

[bx+si]

; 将每一个单词的头一个字母改成大写字母
assume cs:codesg,ds:datasg
datasg segment
    db 'ibm             '
    db 'dec             '
    db 'dos             '
    db 'vax             '
datasg ends
codesg segment
start:  mov ax,datasg
        mov ds,ax
        mov bx,0
        mov cx,4    ;设置外层循环计数值
    s:  mov dx,cx
        mov si,0
        mov cx,3    ;内层循环的次数
    s0: mov al,[bx+si]
        and al,11011111b
        mov [bx+si],al
        inc si
        loop s0
        add bx,16
        mov cx,dx   ;用dx存储的外围循环的计数值恢复cx
        loop s
        mov ax,4c00h
        int 21h
codesg ends
end start

; 将每一个单词的头一个字母改成大写字母dx
assume cs:codesg,ds:datasg
datasg segment
    db 'ibm             '
    db 'dec             '
    db 'dos             '
    db 'vax             '
    dw 0
datasg ends
codesg segment
start:  mov ax,datasg
        mov ds,ax
        mov bx,0
        mov cx,4    ;设置外层循环计数值
    s:  mov ds:[40h],cx
        mov si,0
        mov cx,3    ;内层循环的次数
    s0: mov al,[bx+si]
        and al,11011111b
        mov [bx+si],al
        inc si
        loop s0
        add bx,16
        mov cx,ds:[40h]   ;用datasg:40h单元的值恢复cx
        loop s
        mov ax,4c00h
        int 21h
codesg ends
end start

; 使用栈来暂时存储数据
assume cs:codesg,ds:datasg,ss:stacksg
datasg segment
    db 'ibm             '
    db 'dec             '
    db 'dos             '
    db 'vax             '
datasg ends
stacksg segment
    dw 0,0,0,0,0,0,0,0
stacksg ends
codesg segment
start:  mov ax,stacksg
        mov ss,ax
        mov sp,16   ;栈段
        mov ax,datasg
        mov ds,ax
        mov bx,0
        mov cx,4    ;设置外层循环计数值
    s0: push cx
        mov si,0
        mov cx,3
    s:  mov al,[bx+si]
        and al,11011111b
        mov [bx+si],al
        inc si
        loop s
        add bx,16
        pop cx
        loop s0
        mov ax,4c00h
        int 21h
codesg ends
end start

[bx+si+idata]

; 将每一个单词的前4个字母改成大写字母
assume cs:codesg,ss:stacksg,ds:datasg
stacksg segment
    dw 0,0,0,0,0,0,0,0
stacksg ends
datasg segment
    db '1. display      '
    db '2. brows        '
    db '3. replace      '
    db '4. modify       '
datasg ends
codesg segment
start:  mov ax,stacksg
        mov ss,ax
        mov sp,16

        mov ax,datasg
        mov ds,ax

        mov bx,0
        mov cx,4
    s:  push cx
        mov si,0
        mov cx,4
    s0: mov al,[bx+si+3]
        and al,11011111b
        mov [bx+si+3],al
        inc si
        loop s0
        add bx,16
        pop cx
        loop s
        mov ax,4c00h
        int 21h
codesg ends
end start
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值