汇编语言:第5章 BX和LOOP指令_第1页
汇编语言:第5章 BX和LOOP指令_第2页
汇编语言:第5章 BX和LOOP指令_第3页
汇编语言:第5章 BX和LOOP指令_第4页
汇编语言:第5章 BX和LOOP指令_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第5章[BX]和Loop指令Loop指令的用法[BX]定位内存单元的用法Loop指令和[BX]的联合应用段前缀的使用几个约定[BX]:指偏移地址为(BX)的内存单元。例:MOVAX,[BX]MOVAL,[2000H]LOOP循环指令():指内容。例:若AX=1234H则(AX)=1234H,(AL)=34H(20000H)用idata表示常量(立即数)例:movax,[idata]movax,[0] movax,idatamovax,1234h

例:用()描述下列指令的功能MOVAX,[2](AX)=(DS:2)MOV[2],AX

(DS:2)=(AX)ADDAX,2

(AX)=(AX)+2ADDAX,BX

(AX)=(AX)+(BX)ADDAX,[2]

(AX)=(AX)+(DS:2)PUSHAX

(SP)=(SP)-2(SS:SP)=(AX)POPAX(AX)=(SS:SP)(SP)=(SP)+2一、[BX]EA:偏移地址;SA:段地址;PA:物理地址;例1:

MOVAX,[BX]EA=(BX)SA=(DS)PA=((DS):(BX))5.2

我们常用[BX]来提供内存单元的偏移地址,通过修改BX的值,可由DS:[BX]来寻址不同地址的内存单元。程序和内存中的情况如下图,写出程序执行后,21000H—21007H单元中的内容。Mov ax,2000hMov ds,axMov bx,1000hMov ax,[bx]Inc bxInc bxMov [bx],axInc bxInc bxMov [bx],axInc bxMov [bx],alInc bxMov [bx],al内存情况BE21000H0021001H21002H21003H21004H21005H21006H21007HAx=2000hDs=2000hBx=1000hAx=00BEHBX=1001HBX=1002H(21002H)=00BEHBE00BX=1003HBX=1004H(21004H)=00BEHBx=1005H(21005H)=BEHBE00BEBx=1006H(21006H)=BEHBE二、循环控制指令LOOP

用CX作计数器控制程序的循环。格式:LOOP标号;CX≠0循环功能:当CX≠0时,(CX)=(CX)-1;转移到标号处循环执行。

CX和LOOP指令配合实现循环功能的三个要点:1、在CX中存放循环次数2、LOOP指令中的标号所标识地址要在前面3、要循环执行的程序段写在标号和LOOP指令之间。利用LOOP指令编程计算212ASSUME CS:CODECODE SEGMENT MOVAX,2 MOVCX,11S: ADDAX,AX LOOPS MOVAX,4C00H INT 21HCODE ENDSEND例2:编程,用加法计算123×236,结果存在AX中。三、在DEBUG中跟踪用LOOP指令实现的循环程序ASSUME CS:CODECODE SEGMENT MOVAX,0FFFFH MOVDS,AX MOVBX,6 MOVAL,[BX] MOVAH,0 MOVDX,0 MOVCX,3S: ADDDX,AX LOOPS MOVAX,4C00H INT 21HCODE ENDSEND在汇编源程序中,数据不能以字母开头。ASSUME CS:CODECODE SEGMENT MOVAX,0FFFFH MOVDS,AX MOVBX,6 MOVAL,[BX] MOVAH,0 MOVDX,0

MOVCX,123S: ADDDX,AX LOOPS MOVAX,4C00H INT 21HCODE ENDSEND使用P命令可以将循环指令一次执行结束。也可用“GXXXX”命令来执行到循环结束。四、DEBUG和汇编编译器MASM对指令的不同处理在DEBUG中我们可以使用下面指令来读写内存:MOV AX,[0]MOV AL,[2]MOV BX,[1234H]但在汇编程序中只能使用[寄存器]来寻址内存:例:MOV AX,[BX]在汇编编译器处理中,MOVAX,[1234H]=MOV AX,1234H五、LOOP和[BX]的联合使用 计算:FFFF:0—FFFF:B单元中的数据的和,结果保存在DX中XXFFFF0HXXFFFF1HXXFFFF2HXXFFFF3HXXFFFF4HXXFFFF5HXXFFFF6HXXFFFF7HXXFFFF8HXXFFFF9HXXFFFFAHXXFFFFBH运算结果是否会超出DX能否将数据直接加到DX中能否将数据直接加到DL中办法:将内存单元中的8位数据赋到一个16位寄存器AX中,再将AX加到DX上。 movax,0ffffh movds,ax movdx,0

moval,ds:[0] movah,0 adddx,ax moval,ds:[1] movah,0 adddx,ax moval,ds:[2] movah,0 adddx,ax . . moval,ds:[0bh] movah,0 adddx,axAssumecs:codeCode segment movax,0ffffh movds,ax movdx,0六、段前缀

在访问内存单元的指令中,用于显式地指明内存单元的段地址的“段寄存器:”,在汇编语言中称为段前缀。例:

MOV AX,DS:[BX]MOV AX,CS:[BX]MOV AX,ES:[BX]MOV AX,SS:[0]MOV AL,CS:[1234H]注意:当指令中给出段前缀时,该数据的段地址由指定的段寄存器提供。例:MOVAX,CS:[BX]PA=((CS):(BX))七、一段安全的空间 汇编语言程序直接面向机器,如果我们要向内存空间写入数据时,要保证所写入的内存中没有重要的数据,否则会影响系统的正常运行,在一般的PC机中都不使用0:200—0:300这段内存空间,所以我们可以放心使用这段安全的空间。八、段前缀的使用 编程将内存FFFF:0—FFFF:B单元中的数据拷贝到0:200—0:20B单元中。FFFF0HFFFF1HFFFF2HFFFF3HFFFF4HFFFF5HFFFF6HFFFF7HFFFF8HFFFF9HFFFFAHFFFFBH00200H00201H00202H00203H00204H00205H00206H00207H00208H00209H0020AH0020BH movbx,0 movcx,12S: movax,0ffffh movds,ax movdl,[bx]

movax,0020h mov ds,ax mov[bx],dl inc bx loops movax,4c00h int 21h movbx,0 movcx,12

movax,0ffffh movds,ax movax,0020h moves,axS: movdl,[bx] moves:[bx],dl inc bx loops movax,4c00h int 21h 题目:按下面的程序框架编程,使用循环语句计算1+2+3+…+100,并把结果保存在物理地址12345H指向的字存储单元中。CODESSEGMENTASSUMECS:CODESSTART: ;此处输入功能实现代码MOVAH,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论