[bx]和loop

shiningarmor shiningarmor     2022-12-21     585

关键词:

1.关于[bx]
1)[bx]用来表示取寄存器bx中的值作为偏移地址;
段地址保存在段寄存器ds中;
例如:将 2000:1000 处的数据保存到寄存器ax
mov ax,2000
mov ds,ax
mov bx,1000
mov ax,[bx]
 
2)指令inc
inc 为自增指令;
例如:将寄存器bx中的值自增1
inc bx
 
3)debug和masm对指令的不同处理
例如:想将1000:1处的值存入ax
在debug中代码如下:
mov ax,1000
mov ds,ax
mov ax,[1]
这里的 mov ax,[1]中的[1]表示偏移地址为1,段地址取段寄存器ds中的值;
而用masm编译时不会将[1]识别为偏移地址,而是当做常量1;
也就是说masm将mov ax,[1] 当作mov ax,1 ,作用是将ax中的值设为1;
为了达到原来的目的,可以用[bx];
代码:
mov ax,1000
mov ds,ax
mov bx,1
mov ax,[bx]
如果一定要用常量表示偏移地址,需要显式给出段寄存器
mov ax,1000
mov ds,ax
mov ax,ds:[1]
显式给出段寄存器时,该段寄存器称为段前缀;
段前缀默认是ds:
也可以用cs:、es、ss等代替;
 
4)段前缀的使用
例如:想要将 ffff:0~ffff:b中的数据复制到 20:0~20:b;
思路:
    将偏移地址放入bx;
    循环12次,每次bx中的值自增1,并且通过一个中转寄存器保存待复制数据;
    但这样涉及到一个问题:
        数据的段地址默认保存在段寄存器ds中;
        在每次复制中,需要设置两次ds的值:ffff和20;
    可以利用其它段寄存器分别存放两个段地址来解决这一问题,利用段前缀可指定段地址;
代码:
assume cs:code
code segment
 
    mov ax,ffff
    mov ds,ax
    mov ax,20
    mov es,ax
    mov bx,0
 
    mov cx,12
s:  mov dl,[bx]
    mov es:[bx],dl
    inc bx
    loop s
 
    mov ax,4c00h
    int 21h
code ends
end
 
2.loop指令
loop指令用来做循环操作;
loop的执行分为两步:
    1】寄存器cx中的值减1;
    2】判断cx中的值是否为0,不为0则跳转到标号处,为0则继续向下执行;
指令格式为:loop 标号;
标号是自定义的标记,用来标记特定指令的位置;
例如:计算2的3次方
assume cs:demo
demo segment
    mov ax,2
    mov cx,2
s:  add ax,ax
    loop s
    
    mov ax,4c00h
    int 21h
demo ends
end
 
3.loop和[bx]联合使用
例如:要实现 ffff:0-ffff:b中的数据累加,并将结果存入寄存器dx;
分析:
    1】每个内存单元数据为一个字节,而寄存器dx为一个字,无法直接计算;
    2】如果用dx的低位dl则可能超出dl的容量,累加后的结果可能超出8位;
    3】每一个字节的最大值为255,0-b有13个数,累加结果不会超过16位的25536,因此dx足够可以存放;
    4】可以用寄存器ax作为中介来实现字节和字之间的转换:将目标值存入al,ah设置为0,然后将ax的值累加到dx中;
代码:
assume cs:demo
code demo
    mov ax,ffff
    mov dx,ax
    mov bx,0
    mov dx,0
  
    mov cx,12
s:  mov ah,0
    mov al,[bx]
    add dx,ax
    inc bx
    loop s
 
    mov ax,4c00h
    int 21h
demo ends
end
 
4.安全空间
利用汇编指令直接向内存写入数据时,可能这段内存中保存有系统或其它程序的代码;
此时写入操作可能引发错误;
因为操作系统管理内存资源,如果需要向内存中写入数据时,要使用操作系统给我们分配的空间,而不应该随意指定内存地址;
在dos方式下,一般情况0:200~0:2ff空间不会有系统或其它程序的数据,通常可以直接使用该段空间;
为了谨慎起见,也可以用debug查询该段空间,如果单元内容都是0则表示该段内存单元没有被使用;
 
 
 

实验4[bx]和loop的使用

1.综合使用loop,[bx],编写完整汇编程序,实现向内存b800:07b8开始的连续16个字单元重复填充字数据0403H。2.综合使用loop,[bx],编写完整汇编源程序,实现向内存0:200~0:23F依次传送数据0~63(3FH)。 (1)必做:综合使用loop,[bx],mov实现&n... 查看详情

[bx]和loop

1.关于[bx]1)[bx]用来表示取寄存器bx中的值作为偏移地址;段地址保存在段寄存器ds中;例如:将2000:1000处的数据保存到寄存器axmovax,2000movds,axmovbx,1000movax,[bx] 2)指令incinc为自增指令;例如:将寄存器bx中的值自增1incbx 3)d... 查看详情

实验四[bx]和loop的使用

1.综合使用loop,[bx],编写完整汇编程序,实现向内存b800:07b8开始的连续16个字单元重复填充字数据0403H。 源程序如图所示编译连接后的运行结果将line7的0403h改为0441h后的运行结果为2.综合使用loop,[bx],编写完整汇编源程序,实... 查看详情

实验四[bx]和loop的使用

1.综合使用loop,[bx],编写完整汇编程序,实现向内存b800:07b8开始的连续16个字单元重复填充字数据0403H。代码 assumecs:codecodesegmentmovax,0b800hmovds,axmovbx,07b8hmovcx,16s:mov[bx],0403haddbx,2loopsmovax,4c00hint21hcodeendsend2.综合使用loop, 查看详情

‘第五章[bx]和loop指令

<1>[BX]想要完整地描述一个内存单元,需要两种信息:(1)内存单元的地址(2)内存单元的长度(类型)。[BX]和[0]有些相似,表示一个内存单元,它的偏移地址在bx中。指令movax,[bx]的功能为将bx中存放的数据作为一个偏移... 查看详情

实验4[bx]和loop的使用

...sp;理解和掌握寄存器间接寻址方式[bx]2. 通过汇编指令loop 的使用理解编程语言中循环的本质3. 熟练掌握使用debug 按需调试完整汇编源程序的方法 二、实验准备1.学习/复习第5章使用[bx]和loop实现循环的编程应用... 查看详情

实验4[bx]和loop的使用

1. 综合使用loop,[bx],编写完整汇编程序,实现向内存b800:07b8 开始的连续16 个字单元重复填充字数据0403H。然后在masmtt.asm;linktt.obj;屏幕中间出现一排红心。将源代码程序中字数据0403H→修改为0441H,运行截图2. 综合... 查看详情

实验四[bx]和loop的使用

 1.综合使用loop,[bx],编写完整汇编程序,实现向内存b800:07b8开始的连续16个字单元重复填充字数据0403H。 代码如下:  对他进行连接执行,出现了红心。2.综合使用loop,[bx],编写完整汇编源程序,实现向内存0:200~0:23F... 查看详情

实验四[bx]和loop的使用(代码片段)

一:1.综合使用loop,[bx],编写完整汇编程序,实现向内存b800:07b8开始的连续16个字单元重复填充字数据0403H。 代码如下:assumecs:codecodesegmentmovax,0b800hmovds,axmovcx,16movbx,07b8Hmovax,0403hs:mov[bx],alincbxmov[bx],ahincbxloopsmovax,4c00hin 查看详情

第五章[bx]和loop指令(代码片段)

...:movax,4c00h的作用是什么,不加似乎会卡死。1.综合使用loop,[bx],编写完整汇编程序,实现向内存b800:07b8开始的连续16个字单元重复填充字数据0403H。(1)源代码assumecs:codecodesegmentmovax,0b800hmovds,axmovcx,16movbx,07b8Hmovax,0403hs:mov[bx],alincb... 查看详情

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

[bx]由于在编译器中movAX,[0]指令会被编译器认为是movAX,0所以引入[bx]的概念mov[bx],AX的意思是将(ds)*16+(bx)内存位置的值赋给AX用法和之前的ds[address]一样小Tips1;[bx]的使用方法2movax,1000H34movbx,2000H56movds,ax;将ds数据段寄存器赋值为2000H78mov... 查看详情

实验4[bx]和loop的使用

实验内容1.综合使用loop,[bx],编写完整汇编程序,实现向内存b800:07b8开始的连续16个字单元重复填充字数据0403H。实验代码:assumecs:codecodesegment  movax,0b800h(不能以字母开头,前面置零)  movds,ax  movcx,16  movbx,07b8h  movax... 查看详情

第五章[bx]和loop指令

1.完整的描述一个内存单元,需要的信息:a:内存单元的地址 b:内存单元的长度(类型)用[...]表示一个内存单元时,[]内的内容表示单元的偏移地址,段地址默认在ds寄存器中(也可以显示指出,如ss:[bx]),单元的长度(类型)有指... 查看详情

实验4[bx]和loop的使用

实验结论实验1:综合使用loop,[bx],编写完整汇编程序,实现向内存b800:07b8开始的连续16个字单元重复填充字数据0403H。1.源代码及实验结果运行结果:屏幕中央出现一排红色的心?。2.将源代码程序中字数据0403H→修改为0441H,再次... 查看详情

实验四bx和loop的使用

实验结论:1、(1)assumecs:codecodesegmentmovax,0b800hmovds,axmovcx,16movbx,07b8hmovax,0403hs:mov[bx],axaddbx,2loopsmovax,4c00hint21hcodeendsend(2)2、(1)assumecs:codecodesegmentmovax,0movds,axmovbx,0200hmovcx, 查看详情

汇编实验肆[bx]和loop的使用

南京信息工程大学实验报告实验名称  实验4[bx]和loop的使用  实验日期     11.25            得分     &n 查看详情

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

...址EA,段地址SA默认在ds中,将SA:EA处的数据送入ax中。5.2Loop指令  指令的格式是:loop标号,CPU执行loop指令的时候,要进行两步操作:    1.(cx)=(cx)-1;    2.判断cx中的值,不为零则转至标号处执行程序,如果为零则向... 查看详情

实验4[bx]和loop的使用(代码片段)

实验1.综合使用loop,[bx],编写完整汇编程序,实现向内存b800:07b8开始的连续16个字单元重复填充字数据0403H。1.编写指令assumecs:codecodesegmentmovax,0b800hmovds,axmovbx,07b8hmovcx,16s:mov[bx],0403haddbx,2loopsmovax,4c00hint21hcodeendsend2.编译,链接,执行... 查看详情