Featured image of post 汇编 03 [BX] && Loop

汇编 03 [BX] && Loop

🌏汇编语言 🎯 汇编 03 [BX] && Loop

🎄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,4c00hint 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
Licensed under CC BY-NC-SA 4.0