混子汇编语言学习之05笔记
2021-10-20 本文已影响0人
那个混子
第五章
前言
本章主要介绍了[BX]、LOOP的相关使用及含义,主要还是通过程序例子学习理解,其中LOOP是一个循环指令,类似于C语言中的for循环,(cx)就是对应的循环变量i,学习这这些还得通过例子学习。
正文
[bx]、loop定义
- [bx] 的含义:[bx]同样表示一个内存单元,它的偏移地址在bx中,段地址默认在ds中
- loop:循环指令
格式是:loop 标号,CPU执行loop指令的时候,要进行两步操作,
(cx) = (cx) - 1;判断 cx 中的值,不为零则转至标号处执行程序,如果为零则向下执行。
[bx]例子:
mov ax,2000H
mov ds,ax ;前两句主要是对DS赋值 的,ds=2000H;
mov bx,1000H ;bx=1000H
mov ax, [bx] ;此处bx的值就是偏移地址值,即把地址为2000H:1000H中的数据赋值给ax,ax=00beH;
inc bx ;将bx的内容加1 操作,即bx=1001H
inc bx ;将bx的内容加1 操作,即bx=1002H
mov [bx] ,ax ;将ax的值传入地址2000H:1002H中去,此时2000H:10002H地址中存be
;2000H:10003H中存00;
inc bx
inc bx ;将bx的内容加1 操作,执行后bx = 1004H,需要注意是对bx操作而不是对应地址的值操作
mov [bx] ,ax ;将ax的值传入地址为2000H:10004H中去
inc bx
mov [bx] ,al ;将al的值送入地址为2000H:10005H中去,即2000H:10005H中存的值为BE
inc bx
mov [bx] ,al ;将会al的值送入地址为2000H:1006H中去,即2000H:10006H中存的值为BE
执行后
LOOP例子:
要求:assume cs:code ;下面名字为code的段程序与段寄存器cs关联
code segment ;命名一个叫code的段
mov ax,0ffffh
mov ds, ax ; 最终实现段地址寄存器(ds)=0ffffh,
mov ax,0020h
mov es,ax ; (es)=0020h
mov bx,0 ; (bx)=0,此时ds:bx指向ffff:0,es:bx指向0020: o
mov cx,12 ; ( cx)=12,循环12次
s :mov dl,[bx] ; (dl)= ( (ds)* 16+(bx)),将ffff:bx中的数据送入dl
mov es: [bx ] ,dl ; ( (es)*16+(bx) )=(dl),将dl中的数据送入0020:bx
inc bx ; (bx)=(bx)+1
loop s ;循环从s处重新开始执行,需要注意执行到这里cx=cx-1;然后判断cx是否为零,不为零则跳转s
;执行循环体,如果为零则执行后面的指令
mov ax, 4c00h
int 21h ;退出程序
code ends ;结束段
end ;结束本次程序
注意:
- 汇编语言中的注释用
;
之后的为注释内容 - segment 说明一个段的开始,ends说明一个段的结束
- end指结束对整个程序的编译
- assume 假设的意思,假设某段汇编与寄存器关联
- 上述例子中的
s
是一个标号,标号实际上指的是一个地址
*mov ax,4c00h int 21h
表明应用程序要退出,并为调用本程序的程序返回00,传递退出信息。 - 上述程序使用es 存放目标空间0020:0~0020:b 的段地址,用ds 存放源始空间ffff:O~ffff:b 的段地址。在访问内存单元的指令“mov es:[bx],al”中,显式地用段前缀“es:”给出单元的段地址,这样就不必在循环中重复设置ds。(es相当于段地址的中间变量)
参考资料 王爽《汇编语言第三版》
结束
本章理解一下例子就可以,东西太多记不住!
欢迎关注本人微信公众号:那个混子
记录自己学习的过程,分享乐趣、技术、想法、感悟、情感!