loop 指令的格式是: loop 标号, CPU 执行loop 指令的时候,要进行两步操作,①(cx)=(cx) - 1 :②判断ex 中的值,不为零则转至标号处执行程序,如果为零则向下执行。
assume cs:code
code segmentmov ax,2mov cx,11s:add ax,axloop smov ax,4c00hint 21h
code ends
end
g命令可以执行循环之前的所有指令,跳转到循环指令
p命令可以直接结束循环
在debug中的编程实现:
mov ax, 2000
mov ds,ax
mov al, [OJ
mov bl, [1]
mov cl, [2]
mov dl, [3]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R0gFjEJQ-1670244890097)(C:\Users\ALANSHAO\AppData\Roaming\Typora\typora-user-images\image-20221205202318024.png)]
在源代码中的实现:
assume cs:code
code segment
mov ax, 2000h
mov ds, ax
mov al, [OJ
mov bl, [1]
mov cl, [2]
mov dl, [3]
mov ax , 4c00h
int 21h
code ends
end
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zxUpwn5d-1670244890098)(C:\Users\ALANSHAO\AppData\Roaming\Typora\typora-user-images\image-20221205202431543.png)]
Debug 和编译器masm 对形如“ movax,[0]”这类指令在解释上的不同。我们在Debug 中和源程序中写入同样形式的指令:“ mov al,[O]”、“ mov bl,[l ]”、“ mov cl,[2]”、“ mov dl,[3]”,但Debug 和编译器对这些指令中的“[idata]”却有不同的解释。Debug 将它解释为"[idata]”是一个内存单元,“ idata ”是内存单元的偏移地址;而编译器将"[idata]”解释为" idata
要在“[]”的前面显式地给出段地址所在的段寄存器。比如我们可以这样访问2000:0 单元:mov al,ds:[0]
dw 即“ define word ” 。在这里,使用dw 定义了8 个字型数据(数据之间以逗号分隔),它们所占的内存空间的大小为16 个字节。
程序在运行的时候cs 中存放代码段的段地址,所以可以从cs 中得到它们的段地址。因为用dw 定义的数据处于代码段的最开始,所以偏移地址为0,这8 个数据就在代码段的偏移0 、2 、4、6 、8 、A 、C 、E 处。程序运行时,它们的地址就是CS:O 、CS:2 、cs 炜、CS:6 、CS:8 、CS:A 、CS:C 、CS:E 。
end 除了通知编译器程序结束外,还可以通知编译器程序的入口在什么地方。在程序6.2 中我们用end指令指明了程序的入口在标号sta口处,也就是说, “ movbx 。”是程序的第一条指令。
assume cs:code
code segment数据
start;代码
code ends
end start
assume cs:codesg
codesg segment
dw 0123h,0456h,0789h,Oabch,Odefh,Ofedh , Ocbah,0987h
dW 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
;用dw 定义16 个字型数据,在程序加载后,将取得16 个字的
; 内存空间,存放这16 个数据。在后面的程序中将这段
;空间当作钱来使用
start:mov ax,cs
mov ss,ax
mov sp,30h
;将设置枝顶ss:sp 指向cs:30
mov bx,O
mov cx,8
s: push cs: [bx]
add bx , 2
loop s ;以上将代码段。~ 15 单元中的8 个字型数据依次入战
mov bx,O
mov cx,8
sO: pop cs : [bx]
add bx,2
loop sO ;以上依次出钱8 个字型数据到代码段0~ 15 单元中
mov ax,4c00h
int 2lh
codesg ends
end start
将代码段、数据段、栈段分开放置如下:
assume cs:b,ds:a,ss:ca segmentdw 0123h, 0456h,0789h,Oabch,Odefh,Ofedh,0cbah,0987h
a endsc segmentdw 0,0,0 , 0,0,0,0,0,0,0,0,0,0,0,0,0
c endsb segemnt
d: mov ax,cmov ss,axmov sp,20h ;希望用c 段当作钱空间,设置ss:sp 指向c:20mov ax,amov ds,ax ;希望用d s :bx 访问a 段中的数据, ds 指向a 段mov bx,0mov cx,8s:push [bx] ;以上将a 段中的0 ~ 15 单元中的8 个字型数据依次入技add bx,2loop s mov bx,0mov cx,8s0:pop [bx] ;以上依次出战8 个字型数据到a 段的0 ~ 15 单元中add bx,2loop s0mov ax,ac00hint 21h
b ends
end d ;d 处是要执行的第一条指令,即程序的入口cx,8s0:pop [bx] ;以上依次出战8 个字型数据到a 段的0 ~ 15 单元中add bx,2loop s0mov ax,ac00hint 21h
b ends
end d ;d 处是要执行的第一条指令,即程序的入口