[BX]和loop指令2

137 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。 问题5.2

image.png

assume cs:code
code segment


start:	mov ax, 0
		mov cx, 236
	s:	add ax, 123
		loop s 
		
		mov ax, 4c00H
		int 21H
code ends
end start

 

5.3在Debug中跟踪用loop指令实现的循环程序

问题1

image.png

image.png

 

image.png

若实现ffff:0006单元向ax赋值,我们应该令 (ah)=0,(al)=(ffff6H)

image.png

mov al,[bx] 加上 mov ah,0 与 mov ax, [bx]的区别

内存单元[bx]是8位,但通用寄存器ax是16位,越位赋值可能会产生错误

(但实际运行中似乎没有什么影响???)

 

此程序第一条指令mov ax,0ffffH,为什么要这样?

汇编源程序中,数据不能以字母开头

image.png

image.png

G命令

该命令后面可以跟地址和断点,即格式为 g [=address] [breakpoints],运行到内存指定位置的代码后暂停,如果不加参数默认是从当前IP运行到程序结束。

image.png 将程序直接运行到断点,然后再停止

P指令

image.png

将程序单步运行至循环位置

-p直接执行完循环(后台执行循环),不想看后台复杂的中断过程。

 

小结

[bx]的作用:作为偏移地址与DS配合

 

loop与cx合作

cx存放loop循环的次数

 

debug -g偏移地址命令和-p命令

 

5.4 Debug和汇编编译器Masm对指令的不同处理

image.png

在MASM中若要像Debug一样直接用[2]表示内存单元也可以,但必须要加上段地址

image.png

image.png

 

p指令作用:1.结束程序

2.结束循环

 

-g 偏移地址 跳到断点

 

 

mov al, [bx]与mov al, ds:[bx]是一样的

 

5.5loop和[bx]的联合应用

问题(解惑)

image.png 注意:内存单元为8位,但dx为16位

image.png 类型的匹配(8位和16位)和结果的不越界

最佳解决方案:以一个16位寄存器作为中介

1.每一次累加先将内存单元的值赋到ax中

2.再将ax加到dx中

image.png

image.png  

 

5.6段前缀

若不指明内存单元的段地址,默认为ds

也可自己指定

如:

mov ax,cs:[0]

mov bx,es:[0]