汇编语言——[bx]和loop指令

[bx]

由于在编译器中mov AX,[0]指令会被编译器认为是mov AX,0所以引入[bx]的概念

mov [bx],AX的意思是将(ds)*16+(bx)内存位置的值赋给AX

用法和之前的ds[address]一样

小Tips

 1 ; [bx]的使用方法
 2 mov ax,1000H
 3
 4 mov bx,2000H
 5
 6 mov ds,ax    ; 将ds数据段寄存器赋值为2000H
 7
 8 mov [bx],ax    ; 将ax寄存器的值赋给内存单元21000H位置
 9
10 ; 其他方式
11 mov ax,ds:[0]    ; 将内存单元20000H位置的值赋给ax

Loop指令(循环)

指令的格式是:loop 标号,CPU 执行loop指令的时候,要进行两步操作:
① (cx)=(cx)-1;
② 判断cx中的值,不为零则转至标号处执行程序,如果为零则向下执行。

通常我们用loop指令来实现循环功能,cx 中存放循环次数。

示例:使用程序来计算211

 1 assume cs:code
 2 code segment
 3 start:mov ax,2
 4       mov cx,11      ; 设定循环次数为11
 5       s:  add ax,ax        ; 每次循环执行的操作,每次执行的时候使cx-1
 6       loop s        ; 验证cx的值是否为0,为0执行下面的程序,否则跳回s(s可以为任意字符串)执行
 7       mov ax,4c00h    ; 程序返回
 8       int 21h
 9 code ends    ; 代码段结束
10 end start

示例2:用加法计算123 x236 ,结果存在ax 中。

 1 assume cs:xinge        ; 定位代码段,
 2     xinge segment    ; 代码段可以为任意名字
 3 start:mov ax,0
 4       mov cx,123
 5       jiaxin:
 6         add ax,236   ; 要循环的操作
 7       loop jiaxin
 8       mov ax,4c00h
 9       int 21h
10 code ends
11 end xinge

loop和[bx]的联合应用

思考:计算ffff:0~ffff:b单元中的数据的和,结果存储在dx中。

先看一个错的:错误原因,只定义了dl++,溢出不进位

 1 assume cs:code
 2 code segment
 3 start:    mov ax,0ffffH    ; 编译器不支持字母开头的
 4     mov ds,ax
 5     mov bx,0
 6     mov dl,0
 7     mov dh,0
 8     mov cx,12
 9
10     s:add dl,[bx]
11       inc bx
12       loop s
13
14       mov ax,4c00H
15       int 21
16 code ends
17 end start

正确的

 1 assume cs:code
 2 code segment
 3 start:    mov ax,0ffffH    ; 编译器不支持字母开头的
 4     mov ds,ax
 5     mov bx,0
 6     mov dx,0
 7     mov cx,12
 8
 9     s:mov al,[bx]    ; 为低位赋值
10       mov ah,0
11       add dx,ax        ; 用16位的相加,这样不会溢出
12       inc bx
13       loop s
14
15       mov ax,4c00H
16       int 21
17 code ends
18 end start

段前缀

出现在访问内存单元的指令中,用于显式地指明内存单元的段地址的“ds:”、“cs:”、“ss:”或“es:”,在汇编语言中称为段前缀。

段前缀的使用:

示例:将内存ffff:0~ffff:b段元中的数据拷贝到 0:200~0:20b单元中。

方法一:不断地修改ds的值,然后赋值

方法二:使用段前缀es:(es是多余段寄存器),这样可以省去不断地换ds的值

 1 assume cs:code
 2 code segment
 3     mov cx,40H    ; 循环次数,3F+1
 4     mov ax,0
 5     mov ds,ax
 6     mov bx,200H
 7     mov dx,0
 8     s:
 9     mov [bx],dx
10     inc dx
11     loop s
12
13     mov ax,4c00H
14     int 21H
15 code ends
16 end

第一题答案

 1 assume cs:code
 2 code segment
 3     mov cx,40H
 4     mov ax,20    ; 另段地址改为20
 5     mov ds,ax
 6     mov bx,0    ; bx就可以从0开始,和要推进内存单元的值一样了
 7     s:
 8     mov ds:[bx],bx
 9     inc bx
10     loop s
11
12     mov ax,4c00H
13     int 21H
14 code ends
15 end

第二题答案

时间: 2024-11-09 19:54:04

汇编语言——[bx]和loop指令的相关文章

汇编语言 [BX]和loop指令

一      .[bx] 1. mov ax,[bx] bx中存放的数据作为一个偏移地址EA,段地址SA默认在ds中,将SA:EA处的数据送入ax中. 2. mov [bx],ax bx中存放的数据作为一个偏移地址EA,段地址SA默认在ds中,将ax中的数据送入内存SA:EA处. 3. inc bx 其表示的含义是bx中的内容加1,比如下面两条指令: mov bx,1 inc bx 执行之后的结果,bx=2. 二     loop指令 1.  cx中的值影响着loop指令的执行结果.我们用loo

汇编入门学习笔记 (四)—— [BX] 和 loop指令

疯狂的暑假学习之  汇编入门学习笔记 (四)-- [BX]  和 loop指令 参考:<汇编语言> 王爽 第5章 1.[BX] mov al,[1] 在debug中,会把bs:1 中数据赋给al,但在在masm中不会把bs:1 中数据赋给al,而是把 [1] 认为是 1 赋给al. 如果要实现在debug中的mov al,[1],在masm中就需要[bx] 如: mov bx,1 mov al,[bx] 还可以用 bs:[1] 的方式 如: mov al,bs:[1] 2.loop 循环 要使

[bx]和loop指令

1.[bx]的含义 [bx]表示一个内存单元,它的偏移地址在bx中,比如:mov ax,[bx]会将一个内存单元的内容送入ax,这个内存单元的长度是2个字节,存放一个字,偏移地址存放在bx中,段地址在ds中.mov al,[bx]则是移动半个字. 2.loop指令 loop 标号 CPU执行loop指令的时候分两步: 1.(cx)=(cx)-1 2.判定cx中的值,不为零则转至标号出执行程序,如果为0则向下执行. 从上面的描述中,我们可以看到,cx中的值影响着loop指令的执行效果.通常我们lo

王爽《汇编语言》第三版 第五章 [BX]和loop指令

5.1 [bx] mov ax,[bx]功能:bx 中存放的数据作为一个偏移地址EA ,段地址SA 默认在ds 中,将SA:EA处的数据送入ax中. 5.2 Loop指令 指令的格式是:loop 标号,CPU 执行loop指令的时候,要进行两步操作: 1.(cx)=(cx)-1: 2.判断cx中的值,不为零则转至标号处执行程序,如果为零则向下执行. 通常我们用loop指令来实现循环功能,cx 中存放循环次数. 5.3 在Debug中跟踪用loop指令实现的循环程序 5.4 Debug和汇编编译器

小甲鱼零基础汇编语言学习笔记第五章之[BX]和loop指令

这一章主要介绍什么是[BX]以及loop(循环)指令怎么使用,loop和[BX]又怎么样相结合,段前缀又是什么鬼,以及如何使用段前缀. 1.[BX]的概念 [BX]和[0]类似,[0]表示内存单元的偏移地址是0.要完整描述一个内存单元,需要两种信息:内存单元的地址,内存单元的长度(类型).[BX]同样也表示一个内存单元,它的偏移地址在bx中,比如指令:mov ax,[bx].这里我们以一个程序为例: 1 assume cs:codesg 2 codesg segment 3 start: mov

汇编语言学习第五章-[BX]和loop指令

本博文系列参考自<<汇编语言>>第三版,作者:王爽 1.[bx]和内存单元的描述 [bx]与我们前面见过的[0]类似,mov ax,[0] 的意思是将内存地址为DS:0的两字节内容存入ax中.其中[0]中的0代表的是偏移地址. 类似的,我们有 mov al,[0]的意思是将内存地址为DS:0的单字节内容存入al中.那么我们可以大胆的推断mov ax,[bx]代表的是将偏移地址为bx寄存器中的值的内存地址的两字节内容存入到ax中,其段地址在DS中存储. 2.关于定义的描述性符号: &

汇编语言:第五章 [BX]和loop指令

1.[bx]与内存单元 [bx]是指 段地址在DS中,偏移地址在bx中的内存单元 2.loop 用于描述循环 3.我们定义的描述性符号 "()" 寄存器: (ax/al)表示ax/al寄存器中的内容 段寄存器:   ((ds)*16+(bx))表示段地址为ds内容,偏移地址为bx内容的内存单元的内容 内存单元:   (20000H)表示20000H内存单元中的内容 4.约定符号idata表示常量 mov ax,idata 表示mov ax,1 mov ax,2 等 mov ax,[id

实验四 [BX]和loop指令

一.练习1 编写完整汇编源程序,实现向内存b800:07b8开始的连续16个字单元重复填充字数据0430h. 源程序如下: 运行结果如下: 二.练习2 综合使用loop和[bx],编写完整汇编源程序,实现向内存0:200~0:23f依次传送数据0~63(3FH). 源程序代码如下: assume cs:code code segment mov ax,00020h mov ds,ax mov bx,0 mov cx,64 s: mov [bx],bx inc bx loop s mov ax,4

‘第五章 [BX]和loop指令

<1>[BX] 想要完整地描述一个内存单元,需要两种信息:(1)内存单元的地址(2)内存单元的长度(类型).[BX]和[0]有些相似,表示一个内存单元,它的偏移地址在bx中.指令mov ax,[bx]的功能为将bx中存放的数据作为一个偏移地址EA,段地址SA默认在ds中,将SA:EA处的数据送入ax中,即(ax)=((ds)*16+(bx)).ps:此处的()表示的为括号内寄存器或者内存单元的内容. <2>Loop指令 loop在英语中有循环的含义,所以这个指令应该和循环有关.lo