8086 汇编笔记(六):更灵活的定位内存地址的方法

一、and 和 or 指令

and 指令:逻辑与指令,按位进行与运算(有 0 得 0,全 1 得 1)

mov al,01100011B
and al,00111011B

结果:00100011B

or 指令:逻辑或指令,按位进行或运算(有 1 得 1,全 0 得 0) 

mov al,01100011B
and al,00111011B

结果:01111011B

二、以字符形式给出的数据

我们可以在汇编程序中,用 ‘’ 的方式指明数据是以字符的形式给出的,编译器将把它们转化为相对应的 ASCII 码

data segment

    db 'unIX'        ;相当于 db 75H,6EH,49H,58H
    db 'foRK'

data ends

code segment

start:  mov al,'a'        ;相当于 mov al,61H
        mov bl,'b'

        mov ax,4c00h
        int 21h

code ends

end start

三、大小写转换的问题

在ASCII码中,小写字母的对应范围为:61H - 7AH。大写字母的对应范围为:41H - 5AH。可见同一个字母的大写形式的ASCII码比小写形式的ASCII码小20H。

仔细观察大小写字母所对应的ASCII吗二进制形式,可以发现如下规律:大写字母从右数第6位(从1开始计算)全为0,小写字母从右数第6位全为1。

综上我们可以总结出大小写转换的两种方式:

字母大小写转换方式1:

  1. 大写字母加上20h可转换为小写字母。
  2. 小写字母减去20h可转换为大写字母。

字母大小写转换方式2:

  1. 字母转大写:逻辑与11011111B。
  2. 字母转小写:逻辑或00100000B。
datasg segment

    db 'BaSiC'              ;转大写
    db 'iNfOrMaTiOn'        ;转小写

datasg ends

codesg segment

start:  mov ax,datasg        ;设置 ds 指向 datasg 段
        mov ds,ax
        mov bx,0             ;设置(bx)=0,ds:bx 指向'Basic'的第一个字母
        mov cx,5            ;设置循环次数5,因为'Basic'有5个字母

s:      mov al,[bx]          ;将 ASCII 码从 ds:bx 所指向的单元中取出
        and al,11011111B     ;与运算转大写
        mov [bx],al          ;值重新送入 bx 中
        inc bx               ;+1 指向下一个字符
        loop s

        mov bx,5             ;设置 (bx)=5,ds:bx 指向'iNfOrMaTion'的第一个字母
        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

四、[bx+idata] 

这是一种"变量+常量"的寻址方式

[bx+idata]表示一个内存单元,它的偏移地址为(bx)+idata

mov ax, [bx+200]

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

该指令的常用格式有: 

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

五、SI 和 DI

它俩的功能与 bx 相近

SI和DI不能够分成两个8位寄存器来使用

;(1)
mov bx,0
mov ax,[bx]

;(2)
mov si,0
mov ax,[si]

;(3)
mov di,0
mov ax,[di]

六、[bx+si] 和 [bx+di] 

这是一种“变量+变量”的寻址方式

常用指令格式:

mov ax, [bx+si]
mov ax, [bx][si]

七、[bx+si+idata] 和 [bx+di+idata] 

这是一种"变量+变量+常量"的寻址方式

常用指令格式:

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

八、不同的寻址方式的灵活应用

总结一下前面讲到的几种定位内存地址的方法(寻址方式):

(1)[idata]用一个常量来表示地址,可用于直接定位一个内存单元;

(2)[bx]用一个变量来表示内存地址,可用于间接定位一个内存单元;

(3)[bx+idata]用一个变量和常量表示地址,可在一个起始地址的基础上用变量间接定位一个内存单元;

(4)[bx+si]用两个变量表示地址;

(5)[bx+si+idata]用两个变量和一个常量表示地址。

相关推荐

  1. 8086 汇编笔记(八):转移指令原理

    2024-06-08 12:08:02       10 阅读
  2. 8086 汇编笔记(十一):内中断

    2024-06-08 12:08:02       10 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-08 12:08:02       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-08 12:08:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-08 12:08:02       20 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-08 12:08:02       20 阅读

热门阅读

  1. 挣值计算中的典型与非典型

    2024-06-08 12:08:02       9 阅读
  2. Objective-C中分类无法添加实例变量的底层原理

    2024-06-08 12:08:02       10 阅读
  3. android原生TabLayout之自定义指示器效果

    2024-06-08 12:08:02       10 阅读
  4. Redis持久化机制:RDB与AOF的原理和最佳实践

    2024-06-08 12:08:02       10 阅读
  5. 2023 N1CTF Junior pwn 顶级签到

    2024-06-08 12:08:02       11 阅读
  6. C++ 实现Python 列表list 的两种方法

    2024-06-08 12:08:02       8 阅读
  7. flutter 解析json另类封装方式 List<bean>,哈哈哈

    2024-06-08 12:08:02       8 阅读
  8. Linux学习之查看文件内容

    2024-06-08 12:08:02       12 阅读
  9. linux-磁盘空间显示指令

    2024-06-08 12:08:02       9 阅读
  10. 基于截图和模拟点击的自动化压测工具开发(MFC)

    2024-06-08 12:08:02       8 阅读
  11. Git - 创建和应用patch

    2024-06-08 12:08:02       10 阅读
  12. 自动化喷涂生产线方案三

    2024-06-08 12:08:02       10 阅读
  13. 【每日一函数】uname 函数介绍及代码演示

    2024-06-08 12:08:02       8 阅读