`

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

阅读更多
2014年4月7日 星期一 21时52分08秒

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

7.1 and和or指令
        and 逻辑与指令,按位进行与运行。通过该指令可以将操作对象的相应位设置为0
        or  逻辑或指令,按位进行或运算。通过该指令可以将操作对象的相应位设置为1

7.2 关于ASCII码
       
7.3 以字符形式给出的数据
        在汇编中,用'......'的方式指明数据是以字符形式给出的。

                        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

           debug该段代码:
                        
           用 u 146B:0可以看到对应的代码段:
                       
           用 d 146A:0 可以看到对应的数据段:
                       
                          
7.4 大小写转换问题
                        ;将大写字母变小写,将小写字母变大写
;思路:可以根据大小写字母二进制中第五位值得不用来进行判断

assume cs:code,ds:data
data segment
        db 'BaSiC'
        db 'iNfOrMaTiOn'
data ends

code segment
start:mov ax,data
        mov ds,ax
        mov bx,0
        mov cx,5
  s:mov al,ds:[bx]
    and al,11011111B
        mov ds:[bx],al
        inc bx
        loop s
   
        mov bx,5
        mov dx,11
  s0:mov al,ds:[bx]
    or al,00100000B
        mov ds:[bx],al
        inc bx
        loop s0
       
        mov ax,4c00h
        int 21h
code ends
end start
       
             程序执行前:
                       
             程序执行后:
                       
                       
7.5 用[bx+idata]
        前面我们用[bx]来指明一个内存单元,还可以用一种更为灵活的方式来指明内存单元:[bx+idata]表示一个内存单元。

        指令:mov ax[200+bx]      
                 该指令也可以写为 mov ax,[bx+200]
                                  mov ax,200[bx]
                                  mov ax,[bx].200

        问题7.1
                      assume cs:code
code segment
start:mov ax,2000h
        mov ds,ax
        mov bx,1000h
        mov ax,[bx]
        mov cx,[bx+1]
        mov cx,[bx+2]
       
        mov ax,4c00h
        int 21h
code ends
end start

7.6 用[bx+idata]的方式进行数组的处理
                            ;用[bx+idata]的数组处理方式,将第一个字符串转换为大写,第二个字符串转换为小写
assume cs:code, ds:data
data segment
        db 'BaSiC'
        db 'MinIX'
data ends

code segment
start:mov ax,data
        mov ds,ax
        mov bx,0
        mov cx,5
  s:mov al,ds:[bx]   ; 也可以写为  mov al,0[bx]
    and al,11011111B
        mov ds:[bx],al  
       
        mov al,ds:[bx+5] ; 也可以写为  mov al,5[bx]
        or  al,00100000B
        mov ds:[bx+5],al

        inc bx
        loop s
       
        mov ax,4c00h
        int 21h
code ends
end start;

7.7 SI和DI
        si和di是8086CPU中和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]

        问题7.2 用si和di实现将字符串'welcome to masm!' 复制到它后面的数据区域中。
                                assume cs:code,ds:data
data segment
        db 'welcome to masm!'
        db '................'
data ends

code segment
start:mov ax,data
        mov ds,ax
        mov bx,0
        mov cx,8
  s:mov ax,ds:[bx]
        mov ds:[bx+16],ax
    inc bx
        loop s
       
        mov ax,4c00h
        int 21h
code ends
end start


7.8 [bx+si]和[bx+di]
         [bx+si]和[bx+di]的含义相似。      
         指令 mov ax,[bx+si]的含义如下:
                (ax)=( (ds)*16 +(bx)+(si))
         还可以写成如下格式:
                mov ax,[bx][si]

7.9 [bx+si+idata]和[bx+di+idata]
        指令 mov ax,[bx+si+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

       
7.10 不用寻址方式的灵活运用
        问题7.6
                                       ;问题7.6 将datasg段中每个单词的头一个字母改为大写字母

assume cs:code,ds:data
data segment
        db '1. file        '
        db '2. edit        '
        db '3. search      '
        db '4. help        '
data ends

code segment
        start:mov ax,data
                mov ds,ax
                mov bx,3
                mov cx,4
                mov si,0
          s:mov al,ds:[bx+si]
                and al,11011111B
                mov ds:[bx+si],al
                add si,16
                loop s
       
                mov ax,4c00h
                int 21h
code ends
end start
               
        问题7.7
                                    ;问题7.7 将datasg段中的每个字母都变为大写
assume cs:code,ds:data
data segment
        dd 'ibm             '
        dd 'dec             '
        dd 'dos             '
        dd 'vax             '
data ends

code segment
start:mov ax,data
        mov ds,ax
        mov bx,0
        mov si,0
        mov cx,4
  s:mov al,dx:[bx+si+0]
        and al,11011111B
        mov dx:[bx],al
       
        mov al,dx:[bx+si+1]
        and al,11011111B
        mov dx:[bx],al
       
        mov al,dx:[bx+si+2]
        and al,11011111B
        mov dx:[bx],al
       
        inc bx
        add si,16
        loop s
       
       
        mov ax, 4c00h
        int 21h
code ends
end start
               
        问题7.8 解决二重循环计数器的问题(用dx寄存器暂时存放外层循环的计数器)
                                          ;问题7.7 将datasg段中的每个字母都变为大写
assume cs:code,ds:data
data segment
        dd 'ibm             '
        dd 'dec             '
        dd 'dos             '
        dd 'vax             '
data ends

code segment
start:mov ax,data
        mov ds,ax
        mov bx,0
        mov cx,4
       
  s0:mov dx,cx
         mov cx,3                        ;设置为内层循环的次数
         mov si,0
   s:mov al,ds:[bx+si]
         and al,11011111B
         mov ds:[bx+si],al
         inc si
         loop s
        
         add bx,16
         mov cx,dx                        ;用dx中存放的外层循环的计数器回复cx
         loop s0                        ;外层循环的loop指令将cx中的计数值减1
       
        mov ax, 4c00h
        int 21h
code ends
end start

        问题7.9
                            ;将datasg段中每个单词的前四个字母改为大写

assume cs:code, ds:data, ss:stack
stack segment
        dw 0,0,0,0,0,0,0,0
stack ends

data segment
        db '1. display      '
        db '2. brows        '
        db '3. replace      '
        db '4. modify       '
data ends

code segment
start:mov ax,data
        mov ds,ax
        mov ax,stack
        mov ss,stack
        mov sp,16
       
        mov cs,4
        mov si,3
        mov di,0
s0: push cs
        mov cs,4
  s:mov ax,0
        mov al,ds:[si+di]
        and al,11011111B
        mov ds:[si],al
        inc si
        loop s
        add di,16
        pop cs
loop s0
        mov ax,4c00h
        int 21h
code ends
end start      
               
       

实验六 实践课程中的程序
       


                                                                                         2014-4-8 23:36 记 @sanlihe.xichengqu.beijing
1
0
分享到:
评论
1 楼 文仁126520 2014-04-09  
表示看不懂

相关推荐

    第9章 虚拟内存IV:动态内存分配-高级概念1

    在本章《虚拟内存IV:动态内存分配-高级概念》中,主要探讨了操作系统如何管理内存,特别是关于动态内存分配的高级技术。动态内存分配允许程序在运行时根据需要请求和释放内存,这对于提高资源利用率和灵活性至关...

    《汇编语言》第二版 王爽 中文高清扫描版115M part4 (因为太大,压缩成了6部分,解压后一个文件)

    第7章 更灵活的定位内存地址的方法  第8章 数据处理的两个基本问题  第9章 转移指令的原理  第10章 CALL和RET指令  第11章 标志寄存器  第12章 内中断  第13章 int指令  第14章 端口  第15章 外...

    《计算机操作系统(第四版)》第四章课后习题答案.docx

    为使地址的转换不会影响到指令的执行速度,必须有硬件地址变换机构的支持,程序在执行时,真正访问的内存地址是相对地址与重定位寄存器中的地址相加而形成的。 8. 什么是基于顺序搜索的动态分区分配算法?它可分为...

    汇编语言_王爽(清晰)卷2

    第7章 更灵活的定位内存地址的方法  第8章 数据处理的两个基本问题  第9章 转移指令的原理  第10章 CALL和RET指令  第11章 标志寄存器  第12章 内中断  第13章 int指令  第14章 端口  第15章 外...

    Apache内存池内幕

    1. **查找分配结点:** 通过内存地址找到对应的内存分配结点。 2. **更新链表:** 根据释放后的内存状态更新内存分配结点链表。 3. **合并空闲内存:** 如果可能,尝试合并相邻的空闲内存块。 ##### 3.5 分配子内存...

    第七章第2次作业1

    动态重定位是这种技术的一部分,它使得程序在内存中的实际位置(物理地址)可以与程序中的逻辑地址不同,从而提高了内存利用率和系统的灵活性。在实现动态重定位时,通常需要以下硬件支持: 1. **内存管理单元(MMU)...

    汇编语言_王爽(清晰)卷1

    第7章 更灵活的定位内存地址的方法  第8章 数据处理的两个基本问题  第9章 转移指令的原理  第10章 CALL和RET指令  第11章 标志寄存器  第12章 内中断  第13章 int指令  第14章 端口  第15章 外...

    第七章 指针.docx

    【指针】是C语言中不可或缺的特性,它允许程序直接操作内存地址,极大地增强了程序的灵活性和效率。指针可以被看作是内存单元的地址,用来定位存储在内存中的数据。理解并熟练运用指针是掌握C语言的关键。 **指针的...

    C语言程序设计 第七章.ppt

    第七章主要探讨了指针的相关知识,包括指针的定义、使用、运算以及指针在函数中的应用。 首先,指针是一个变量,它存储的是其他变量的内存地址。内存地址是计算机内存中每个单元的唯一标识,用于定位存储在内存中的...

    汇编语言(第3版).王爽(带详细书签)

    第7章 更灵活的定位内存地址的方法 第8章 数据处理的两个基本问题 第9章 转移指令的原理 第10章 CALL和RET指令 第11章 标志寄存器 第12章 内中断 第13章 int指令 第14章 端口 第15章 外中断 第16章 直接定...

    先进软件开发技术与工具第02讲 内存管理

    2. **页表指示基地址**:更复杂但灵活性更高的方法,利用页表记录页与内存块之间的对应关系,实现从逻辑地址到物理地址的映射。 #### 五、早期的内存分区使用及缺点 早期的内存管理采用静态分区法,即将内存分割成...

    《汇编语言》第二版 王爽 中文高清扫描版115M part6 (因为太大,压缩成了6部分,解压后一个文件)

    第7章 更灵活的定位内存地址的方法  第8章 数据处理的两个基本问题  第9章 转移指令的原理  第10章 CALL和RET指令  第11章 标志寄存器  第12章 内中断  第13章 int指令  第14章 端口  第15章 外...

    《汇编语言》第二版 王爽 中文高清扫描版115M part5 (因为太大,压缩成了6部分,解压后一个文件)

    第7章 更灵活的定位内存地址的方法  第8章 数据处理的两个基本问题  第9章 转移指令的原理  第10章 CALL和RET指令  第11章 标志寄存器  第12章 内中断  第13章 int指令  第14章 端口  第15章 外...

    《汇编语言》第二版 王爽 中文高清扫描版115M part3 (因为太大,压缩成了6部分,解压后一个文件)

    第7章 更灵活的定位内存地址的方法  第8章 数据处理的两个基本问题  第9章 转移指令的原理  第10章 CALL和RET指令  第11章 标志寄存器  第12章 内中断  第13章 int指令  第14章 端口  第15章 外...

    《汇编语言》第二版 王爽 中文高清扫描版115M part2 (因为太大,压缩成了6部分,解压后一个文件)

    第7章 更灵活的定位内存地址的方法  第8章 数据处理的两个基本问题  第9章 转移指令的原理  第10章 CALL和RET指令  第11章 标志寄存器  第12章 内中断  第13章 int指令  第14章 端口  第15章 外...

    计算机组成原理第七章指令系统

    【计算机组成原理第七章指令系统】章节主要探讨的是计算机中指令系统的概念及其重要性。指令系统是计算机硬件和软件之间的接口,它定义了计算机能够执行的基本操作。这包括机器语言,汇编语言以及Instruction Set ...

    操作系统教学课件:第4章 存储器管理-1.ppt

    3. 程序装入:程序地址空间和内存地址空间是两个不同的概念。程序装入包括绝对装入、可重定位装入(静态重定位)和动态运行时装入(动态重定位)。绝对装入是直接按照目标代码的地址装入,适用于内存布局固定的系统...

    内存修改器----CE内存修改器

    2. **地址跟踪**:CE内存修改器能够跟踪内存地址,当程序运行时,内存值发生变化,CE会自动更新这些地址的值,帮助用户定位到动态变化的内存区域。 3. **脚本语言支持**:CE内建了Lua脚本引擎,用户可以通过编写Lua...

    操作系统第三章 存储管理 期末测试复习题及答案.pdf

    25. 段页式存储管理结合了分段的逻辑组织和分页的内存管理,提供更好的灵活性和地址映射。 这些知识点涵盖了内存管理的基本原理、不同分配策略的优缺点、地址转换以及分页和分段存储管理的核心概念。理解这些内容...

Global site tag (gtag.js) - Google Analytics