5.《汇编语言》-王爽第三版学习笔记 [BX]和loop指令

1.[bx], 和 内存单元的描述

  • 完整的描述一个内存单元需要两种信息:
    (1)内存单元地址
    (2)内存单元的长度(类型)
[0] 表示内存单元,它的偏移地址是 0, 段地址在 ds 中,单元的长度(类型)可以由具体指令中的其他操作对象(比如说寄存器)指出
[bx] 也表示内存单元,它的偏移地址在 bx 中,段地址在 ds 中,单元的长度(类型)可以由具体指令中的其他操作对象(比如说寄存器)指出
  1. loop
    循环指令

  2. 描述性的符号 “()”

(ax)表示ax中的内容
(al)表示al中的内容
(20000H)表示内存20000H单元的内容,其中20000H为内存单元的物理地址
  • “()” 中的元素可以由3中类型:
    (1)寄存器名
    (2)段寄存器名
    (3)内存单元的物理地址(一个20位数据)
(ax),(ds),(al),(cx),(2000H),((ds)*16 + (bx))等都是正确的用法。
(2000:0),((ds):1000H) 是不正确的用法。
(X)的应用:
(1)ax 中的内容为 0010H      =>    (ax)=0010H
(2)2000:1000H 中的内容为 0010H      =>    (21000H)=0010H
(3)mov ax,[2]      =>    (ax) = ((ds)*16+2)
(4)mov [2],(ax)      =>    ((ds)*16+2) = (ax)
(5)add ax,2      =>    (ax)=(ax)+2
(6)add ax,bx      =>    (ax)=(ax)+(bx)
(7)push ax      =>    
        (sp)=(sp)-2
        ((ss)*16+(sp))=(ax)
(8)pop ax      =>    
        (ax)=((ss)*16+(sp))
        (sp)=(sp)+2
(9)“(x)” 所表示的数据有两种各类型: 字节, 字。
       哪种类型有寄存器名或具体的运算决定。比如:
       (al)(bl)(cl)等得到的数据为字节型
       (ax)(bx)(cx)等得到的数据为字节型
       (al)=(20000H),则(20000H)得到的数据为字节型
       (ax)=(20000H),则(20000H)得到的数据为字型

5.1 [BX]

mov ax,[bx]      =>    (ax) = ((ds)*16+(bx))
mov [bx],ax      =>     ((ds)*16+(bx)) = (ax)
  • inc bx 的含义是 bx的内容 加1
mov bx,1
inc bx
// 执行后,(bx) = 2

5.2 Loop 指令
(1)格式: loop 标号

CPU在执行loop 的时候要进行两部操作:
(1)(cx)=(cx)-1
(2)判断 cx 中的值,不为0则转至 标号 处执行程序,如果为 0 则乡下执行。
注意:
     cx 中的值影响着 loop 指令的执行结果,通常(注意,说的是通常)我们用loop指令来实现循环功能,cx中存放循环次数。
  • example1: 编程计算 2^11,结果存在 ax 中
assume cs:code
code segment
    mov ax,2
    .... //重复累计做11次 add ax,ax

    mov ax,4c00h
    int 21h
code ends
end
assume cs:code
code segment
    mov ax,2
    
    mov cx,11
s: add ax,ax
    loop s

    mov ax,4c00h
    int 21h
code ends
end
/**
* (1) 标号: 汇编语言中,标号代表一个地址,程序中有一个标号 s, 它实际上标识了一个地址,这个地址处有一条指令:add ax,ax
* (2) loop s : CPU 执行 loop s 的时候,需要进行两步操作:
        第一步: (cx)=(cx)-1
        第二步:判断 cx 中的值,不为 0,则转至标号 s 所标识的地址处执行(程序中的指令是 add ax,ax),如果为 0 则执行下一条指令(下一条指令是 mov ax,4c00h)
*/
  • cx 和 loop 指令相配合实现循环功能的 3 个要点:
(1)在 cx 中存放循环次数
(2)loop 指令中的标号所标识的地址要在前面
(3)要循环执行的程序段,要写在 标号 和 loop 指令的中间
  • cx 和 loop 指令相配合实现循环功能的 程序框架:
    mov cx,循环次数
s:  
    循环执行的程序段
    loop s

5.3 DEBUG中 跟踪 loop 指令实现循环程序

  • 汇编程序中,数据不能以字母开头。
    所以前面要加 0 。 比如 mov ax,0FFFFH
  • g 0012 => 表示 CS:0012 前的程序被执行。
  • 遇到 loop 指令时,使用 p 命令执行, Debug 就会自动重复执行循环中的指令,知道 (cx)= 0 为止。

5.4 Debug 和 汇编编译器 masm 对指令的不同处理


89D5AE61-5605-4C5F-BA87-AAD7563A04BD.png

E60D272C-E906-4175-944F-DD044D68DE03.png
  • Debug 和 编译器 对 “ mov al,[0] ” 的解释不同,debug 中 认为 [0] -> ((ds)*16 + 0) 即 内存单元, 编译器则解释为 常量 0
汇编源程序中一下指令的含义:
mov al,[0]  =>  (al)=0 ,将常量0送入al中 等同于 mov al,0
mov al,ds:[0]  =>  (al)=((ds)*16+0) ,将内存单元中的数据送入al中
mov al,[bx]  =>  (al)=((ds)*16+bx)  ,将内存单元中的数据送入al中
mov al,ds:[bx]  =>  等同于 mov al,[bx]
  • 在汇编源程序中, 如果用指令访问一个内存单元,则在指令中必须用“ [...] ” 来表示内存单元, 如果 “ [] ” 中用的是一个常量 idata,直接给成内存单元地址,就要在 “ [] ” 的前面显式的给出 段地址所在的段寄存器。 比如
    mov al,ds:[0]
  • 如果 “ [] ” 里用寄存器 如 mov al,[bx], 间接给出内存单元的偏移地址,则段地址默认在ds中。当然,也可以显式的给出段地址所在的段寄存器。

5.5 loop 和 [bx] 的联合应用
计算 ffff:0~ffff:b 单元中数据的和,结果存储在 dx 中

assume cs:code
code segment
    mov ax,0ffffh
    mov ds,ax
    mov bx,0
    mov dx,0
    mov cx,12

s:  mov al,[bx]
    mov ah,0
    add dx,ax
    inc bx
    loop s

    mov ax,4c00h
    int 21h

code ends
end

5.6 段前缀 : 出现在访问内存单元的指令中,用于显式的指明内存单元的段地址。

(1)mov ax,ds:[bx]  //将一个内存单元的内容送入 ax,这个内存单元的长度为 2字节(字单元),存放一个字, 偏移地址在 bx 中,段地址在 ds 中。
(2)mov ax,cs:[bx]  //将一个内存单元的内容送入 ax,这个内存单元的长度为 2字节(字单元),存放一个字, 偏移地址在 bx 中,段地址在 cs 中。
(3)mov ax,ss:[bx]  //将一个内存单元的内容送入 ax,这个内存单元的长度为 2字节(字单元),存放一个字, 偏移地址在 bx 中,段地址在 ss 中。
(4)mov ax,es:[bx]  //将一个内存单元的内容送入 ax,这个内存单元的长度为 2字节(字单元),存放一个字, 偏移地址在 bx 中,段地址在 es 中。
(5)mov ax,ss:[0]  //将一个内存单元的内容送入 ax,这个内存单元的长度为 2字节(字单元),存放一个字, 偏移地址 0,段地址在 ss 中。
(6)mov ax,cs:[0]  //将一个内存单元的内容送入 ax,这个内存单元的长度为 2字节(字单元),存放一个字, 偏移地址 0,段地址在 cs 中。

5.7 一段安全的空间:
0:200 ~ 0:2FF

5.7 段前缀的使用:
将 内存 ffff:0 ~ ffff:b 单元中的数据复制到 0:200 ~ 0:20B 单元中

assume cs:code
code segment
    mov bx,0
    mov cx,12

s:  mov ax,0ffffh
    mov ds,ax
    mov dl,[bx]

    mov ax,0020h
    mov ds,ax
    mov [bx],dl

    inc bx
    loops

    mov ax,4c00h
    int 21h
code ends
end
  • 练习
    (1)编程, 向内存 0:200~0:23F 一次传送数据 0~63?
assume cs:code
code segment
    mov ax,0020h
    mov ds,ax
    mov bx,0
    mov cx,64

s:  mov [bx],bx
    inc bx
    loop s

    mov ax,4c00h
    int 21h
code ends
end

(2)下面的程序的功能是将“mov ax,4c00h”之前的指令复制到内存0:200处,补全程序。上机调试,跟踪运行结果。

assume cs:code
code segment
    mov ax,code
    mov ds,ax
    mov ax,0020h
    mov es,ax
    mov bx,0
    mov cx,17h

s:  mov al,[bx]
    mov es:[bx]:al
    inc bx
    loop s

    mov ax,4c00h
    int 21h
code ends
end
B82070D5-D1F5-413B-B891-9445AAD63755.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,264评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,549评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,389评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,616评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,461评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,351评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,776评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,414评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,722评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,760评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,537评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,381评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,787评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,030评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,304评论 1 252
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,734评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,943评论 2 336