zoukankan      html  css  js  c++  java
  • 更灵活的定位内存地址的方法03 零基础入门学习汇编语言34

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

     

    让编程改变世界

    Change the world by program


     

    SI和DI

      SI和DI是8086CPU中和bx功能相近的寄存器,但是SI和DI不能够分成两个8位寄存器来使用。 下面的三组指令实现了相同的功能:

    mov bx,0

    mov ax,[bx]

    mov si,0

    mov ax,[si]

    mov di,0

    mov ax,[di]

      下面的三组指令也实现了相同的功能:

    mov bx,0

    mov ax,[bx+123]

    mov si,0

    mov ax,[si+123]

    mov di,0

    mov ax,[di+123]

     

    问题7.2

      用寄存器SI和DI实现将字符串‘welcome to masm!’复制到它后面的数据区中。 assume cs:codesg,ds:datasg datasg segment

    db 'welcome to masm!'

    db '................'

    datasg ends 思考后看分析。  

    问题7.2分析

      我们编写的程序大都是进行数据的处理,而数据在内存中存放,所以我们在处理数据之前首先要搞清楚数据存储在什么地方,也就是说数据的内存地址。 现在我们要对datasg 段中的数据进行复制,我们先来看一下要复制的数据在什么地方,datasg:0,这是要进行复制的数据的地址。   那么复制到哪里去呢? 应该是复制到它后面的数据区。 因为 “welcome to masm!”从偏移地址0开始存放,长度为 16 个字节,所以,它后面的数据区的偏移地址为 16 ,就是字符串所要存放的空间。   清楚了地址之后,我们就可以进行处理了。 我们用ds:si 指向要复制的源始字符串,用 ds:di 指向复制的目的空间,然后用一个循环来完成复制。  

    代码段:

    注意,在程序中,我们用16位寄存器进行内存单元之间的数据传送,一次复制 2 个字节,一共循环8次。 [codesyntax lang="asm"]
    codesg segment
    start: 
        mov ax,datasg
        mov ds,ax
        mov si,0
        mov di,16
        mov cx,8
    s:  mov ax,[si]
        mov [di],ax
        add si,2
        add di,2
        loop s
    
        mov ax,4c00h
        int 21h
    codesg ends
    end start
    [/codesyntax]    

    问题7.3

      用更少的代码,实现问题7. 2中的程序。 思考后看分析。  

    问题7.3分析

      我们可以利用[bx(si或di)+idata]的方式,来使程序变得简洁。 程序如下: [codesyntax lang="asm"]
    codesg segment
    start: 
        mov ax,datasg
        mov ds,ax
        mov si,0
        mov cx,8
    s:  mov ax,0[si]
        mov 16[si],ax
        add si,2
        loop s
    
        mov ax,4c00h
        int 21h
    codesg ends
    end start
    [/codesyntax]    

    [bx+si]和[bx+di]

      在前面,我们用[bx(si或di)]和[bx(si或di)+idata] 的方式来指明一个内存单元,我们还可以用更灵活的方式: [bx+si]和[bx+di]   [bx+si]和[bx+di]的含义相似,我们以[bx+si]为例进行讲解。 [bx+si]表示一个内存单元,它的偏移地址为(bx)+(si)(即bx中的数值加上si中的数值)。  

    我们看下指令mov ax,[bx+si]的含义:

    将一个内存单元的内容送入ax,这个内存单元的长度为2字节(字单元),存放一个字,偏移地址为bx中的数值加上si中的数值,段地址在ds中。 指令mov ax,[bx+si]的数学化的描述为:(ax)=( (ds)*16+(bx)+(si) ) 该指令也可以写成如下格式(常用):mov ax,[bx][si]  

    问题7.4

      用Debug查看内存,结果如下: 2000:1000 BE 00 06 00 00 00 …… 写出下面的程序执行后,ax、bx、cx中的内容。 [codesyntax lang="asm"]
    mov ax,2000H
    mov ds,ax
    mov bx,1000H
    mov si,0
    mov ax,[bx+si]
    inc si
    mov cx,[bx+si]
    inc si
    mov di,si
    mov ax,[bx+di]
    [/codesyntax]  

    问题7.4分析

      mov ax,[bx+si] 访问的字单元的段地址在ds中,(ds)=2000H; 偏移地址=(bx)+(si)=1000H; 指令执行后(ax)=00BEH。   mov cx,[bx+si] 访问的字单元的段地址在ds中,(ds)=2000H; 偏移地址=(bx)+(si)=1001H; 指令执行后(cx)=0600H。   add cx,[bx+di] 访问的字单元的段地址在ds中,(ds)=2000H; 偏移地址=(bx)+(di)=1002H; 指令执行后(cx)=0606H。  

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

      [bx+si+idata]和[bx+di+idata]的含义相似,我们以[bx+si+idata]为例进行讲解。 [bx+si+idata]表示一个内存单元,它的偏移地址为(bx)+(si)+idata。(即bx中的数值加上si中的数值再加上idata)  

    指令mov ax,[bx+si+idata]的含义:

    将一个内存单元的内容送入ax,这个内存单元的长度为2字节(字单元),存放一个字,偏移地址为bx中的数值加上si中的数值再加上idata,段地址在ds中。   数学化的描述为:  (ax)=( (ds)*16+(bx)+(si)+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.5

      用Debug查看内存,结果如下: 2000:1000 BE 00 06 00 6A 22 …… 写出下面的程序执行后,ax、bx、cx中的内容。 [codesyntax lang="asm"]
    mov ax,2000H
    mov ds,ax
    mov bx,1000H
    mov si,0
    mov ax,[bx+2+si]
    inc si
    mov cx,[bx+2+si]
    inc si
    mov di,si
    mov ax,[bx+2+di]
    [/codesyntax]  

    问题7.5分析

      mov ax,[bx+2+si] 访问的字单元的段地址在ds中,(ds)=2000H; 偏移地址=(bx)+(si)+2=1002H; 指令执行后(ax)=0006H。   mov ax,[bx+2+si] 访问的字单元的段地址在ds中,(ds)=2000H; 偏移地址=(bx)+(si)+2=1003H; 指令执行后(cx)=006AH。   mov ax,[bx+2+si] 访问的字单元的段地址在ds中,(ds)=2000H; 偏移地址=(bx)+(si)+2=1004H; 指令执行后(cx)=226AH。 [buy] 获得所有教学视频、课件、源代码等资源打包 [/buy] [Downlink href='http://kuai.xunlei.com/d/LTYUYMRZQZPC']视频下载[/Downlink]
  • 相关阅读:
    拉格朗日乘子基本概念
    "模式识别与机器学习"读书笔记——2.3(2)
    [raw]人工智能方向调查
    Android !No Launcher activity found!错误
    [raw]ubuntu在当前目录右键打开终端
    Android, 读取大型文件报错
    Blueman Ubuntu的蓝牙管理器
    VMware下Ubuntu8.04 方向键失效的解决方法
    无线中间人攻击初探
    【经验】短接 Flash 解决二次量产金士顿 DTI G2 4GB U盘(群联PS225139)问题
  • 原文地址:https://www.cnblogs.com/LoveFishC/p/3846013.html
Copyright © 2011-2022 走看看