🎄Loop
之前已经写过一个简单的汇编程序 接下来学习使用Loop指令写循环逻辑
🍭 编写程序计算2^3
保存后编译连接生成
loopCode.exe
可执行文件
🍭 Debug
⚡g
命令跳过Loop循环之前的汇编指令
使用g命令跳过Loop循环之前的汇编指令
⚡p
命令跳过Loop循的所有执行过程
🎄[BX]
为何需要[BX]这样的表达方式?这是因为形如
mov ax,[12]
这样的命令,MASM编译器会将其解释为mov ax,12
;而形如mov ax,[bx]
(bx之前被赋值为12H)这样的指令,MASM编译器就能正常解释为出来而在Debug模式下则可以正常解释
mov ax,[12]
接下来写一段程序来验证
⚡debug能够正常解释
⚡编译器会把[idata]
解释为idata
🎄Loop和[BX]联合使用
⚡计算ffff:0~ffff:b
内存单元中值的和并放入dx
寄存器中
assume cs:bxloop
bxloop segment
mov ax,0ffffh
mov ds,ax
mov ah,0 ;ax的高位赋值为0
mov cx,12
mov bx,0
a_loop: mov al,[bx] ;把内存单元的低位存储单元的值赋值给ax寄存器的低位
add dx,ax ;将ax的值累加到dx寄存器
inc bx
loop a_loop
mov ax,4c00h;退出程序
int 21h ;退出程序
bxloop ends
end
⚡程序5.9 复制原始内存单元ffff:0~ffff:b
的数据到0:200~0:20b
中
编写程序
;程序5.9 复制原始内存单元ffff:0~ffff:b的数据到0:200~0:20b中
;分析:可以先用一个段寄存器ds来实现 0:200~0:20b等价于20:0~20:b
assume cs:code5_9
code5_9 segment
mov ax,0ffffh ;设置原始数据ds数据段地址
mov ds,ax ;设置原始数据ds数据段地址
mov ax,0020h ;设置目的数据段地址到es
mov es,ax ;设置目的数据段地址到es
mov bx,0 ;bx作为数据下标
mov cx,12 ;cx循环计数12次 每循环1次 cx-- 当cx===0循环退出
s: mov dl,[bx] ;将ds:bx中的数据放入dl
mov es:[bx],dl ;复制单元数据
inc bx ;bx自增
loop s ;循环s
mov ax,4c00h ;程序退出
int 21h ;程序退出
code5_9 ends
end
编译连接后Debug 查看原内存和目标内存的存储内容
程序运行结束查看内存结果
🎄练习
⚡练习1 向内存0:200~0:23F依次传递数据0~63(3FH)
assume cs:code5_10
code5_10 segment
mov ax,0H
mov ds,ax ;指派段地址
mov bx,200H;指派数据下标
mov cx,64 ;循环64次
mov dl,0 ;dx寄存器的低位存储要复制的数据 存储 0~63(3FH)
s: mov ds:[bx],dl ;注意这里复制的时候只用dx寄存器的低位 把它当做一个单字节寄存器来使用
inc dl ;dl自增
inc bx ;bx自增
loop s
mov ax,4c00h
int 21h
code5_10 ends
end
程序运行前查看目的内存内容
编译、连接、运行,查看运行结果
⚡练习2 向内存0:200~0:23F依次传递数据0~63(3FH)要求主题程序只能用9条指令(9条指令包括mov ax,4c00h
和int 21h
)
0000:0200-0000:023F
等同于0020:00-0002:3F
assume cs:code
code segment
mov ax,20h
mov ds,ax;设置ds=0
mov cx,64;循环64次
mov al,0;传送的数据
s: mov ds:[al],al
inc al
loop s
mov ax,4c00h
int 21h
code ends
end