• 更灵活的定位内存地址的方法


    与其说这一章是在讲如何在汇编语法上更方便的定位内存地址,不如说是如何在底层中抽象出一种数据结构来。

    and和or指令

    and指令:逻辑与指令,按位进行计算,全一得一
    or指令:逻辑或指令,按位进行计算,逢一得一

    以字符形式给出数据

    在汇编程序中,以'....'指明数据是以字符的形式给出的,编译器将把他们转换位相应的ASCII码。

    ASCII码大小写转换的问题

    同一个字母的大写写小写字符对应的ASCII码是不同的,他们之间相差20H。使用二进制表示也就是相差100000B。
    UTOOLS1560927449284.png

    所以很明显的看出来,大写字母和小写字母之间的区别就是第6位(位数从1开始计算)是否为1。

    [bx+idata]

    mov ax, [bx+200]
    数学化的描述为:(ax)=((ds)*16+(bx)+200)
    该指令还可以写成如下形式:
    mov ax, [200+bx]
    mov ax, 200[bx]
    mov ax, [bx].200

    si和di

    在8086中和bx功能相近的寄存器,bx是默认的数据段偏移地址寄存器。
    si和di都可以作为数据段偏移地址寄存器来使用,与bx的用法相同。但si和di不能够分成两个8位寄存器。

    [bx+si]和[bx+di]

    之前是一个常量加上一个变量(bx),现在是两个常量,可以看出来,偏移地址的指定更加的灵活了。
    指令mov ax, [bx+si]
    数学化的描述为:(ax)=((ds)*16+(bx)+(si))
    也可以是以下格式:
    mov ax, [bx][si]

    [bx+si+idata]

    不必多说,应该很容易明白。

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

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

    问:如何实现一个嵌套的循环
    答:使用另外一个寄存器或者使用内存展示存储cx的值,在遇到对应的循环语句时将其取出。





  • 相关阅读:
    Spring学习总结之高级装配
    Spring学习总结之装配bean
    NS2安装过程中环境变量设置的问题(ns-2.35)
    =======================分割线======================================
    java的内存管理机制
    Python之面向对象编程
    Python之列表生成式
    Python之函数的参数
    Git基础级介绍
    第四次作业——个人作业——软件案例分析
  • 原文地址:https://www.cnblogs.com/freesfu/p/11051585.html
Copyright © 2020-2023  润新知