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


    一、and 和 or 指令

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

    1. mov al,01100011B
    2. and al,00111011B
    3. 结果:00100011B

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

    1. mov al,01100011B
    2. and al,00111011B
    3. 结果:01111011B

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

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

    1. data segment
    2. db 'unIX' ;相当于 db 75H,6EH,49H,58H
    3. db 'foRK'
    4. data ends
    5. code segment
    6. start: mov al,'a' ;相当于 mov al,61H
    7. mov bl,'b'
    8. mov ax,4c00h
    9. int 21h
    10. code ends
    11. 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。
    1. datasg segment
    2. db 'BaSiC' ;转大写
    3. db 'iNfOrMaTiOn' ;转小写
    4. datasg ends
    5. codesg segment
    6. start: mov ax,datasg ;设置 ds 指向 datasg 段
    7. mov ds,ax
    8. mov bx,0 ;设置(bx)=0,ds:bx 指向'Basic'的第一个字母
    9. mov cx,5 ;设置循环次数5,因为'Basic'5个字母
    10. s: mov al,[bx] ;将 ASCII 码从 ds:bx 所指向的单元中取出
    11. and al,11011111B ;与运算转大写
    12. mov [bx],al ;值重新送入 bx 中
    13. inc bx ;+1 指向下一个字符
    14. loop s
    15. mov bx,5 ;设置 (bx)=5,ds:bx 指向'iNfOrMaTion'的第一个字母
    16. mov cx,11
    17. s0: mov al,[bx]
    18. or al,00100000B
    19. mov [bx] al
    20. inc bx
    21. loop s0
    22. mov ax,4c00h
    23. int 21h
    24. codesg ends
    25. end start

    四、[bx+idata] 

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

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

    mov ax, [bx+200]

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

    该指令的常用格式有: 

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

    五、SI 和 DI

    它俩的功能与 bx 相近

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

    1. ;(1)
    2. mov bx,0
    3. mov ax,[bx]
    4. ;(2)
    5. mov si,0
    6. mov ax,[si]
    7. ;(3)
    8. mov di,0
    9. mov ax,[di]

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

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

    常用指令格式:

    1. mov ax, [bx+si]
    2. mov ax, [bx][si]

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

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

    常用指令格式:

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

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

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

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

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

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

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

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

  • 相关阅读:
    968. 监控二叉树
    宠物社区系统宠物领养小程序,宠物救助小程序系统多少钱?
    Unity在Windows选项下没有Auto Streaming
    docker部署redis集群 删除节点(缩容)
    2023年数维杯国际大学生数学建模挑战赛A题
    APS智能排产帮助企业做好生产管理
    Spring Boot面试题解析
    操作系统 线程的创建
    进销存软件对中小型企业管理有什么作用?
    HotSpot 虚拟机对象探秘-对象的创建、内存布局、访问定位
  • 原文地址:https://blog.csdn.net/2302_82189125/article/details/139332315