本文已参与「新人创作礼」活动,一起开启掘金创作之路。 问题5.2
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
若实现ffff:0006单元向ax赋值,我们应该令 (ah)=0,(al)=(ffff6H)
mov al,[bx] 加上 mov ah,0 与 mov ax, [bx]的区别
内存单元[bx]是8位,但通用寄存器ax是16位,越位赋值可能会产生错误
(但实际运行中似乎没有什么影响???)
此程序第一条指令mov ax,0ffffH,为什么要这样?
汇编源程序中,数据不能以字母开头
G命令
该命令后面可以跟地址和断点,即格式为 g [=address] [breakpoints],运行到内存指定位置的代码后暂停,如果不加参数默认是从当前IP运行到程序结束。
将程序直接运行到断点,然后再停止
P指令
将程序单步运行至循环位置
-p直接执行完循环(后台执行循环),不想看后台复杂的中断过程。
小结
[bx]的作用:作为偏移地址与DS配合
loop与cx合作
cx存放loop循环的次数
debug -g偏移地址命令和-p命令
5.4 Debug和汇编编译器Masm对指令的不同处理
在MASM中若要像Debug一样直接用[2]表示内存单元也可以,但必须要加上段地址
p指令作用:1.结束程序
2.结束循环
-g 偏移地址 跳到断点
mov al, [bx]与mov al, ds:[bx]是一样的
5.5loop和[bx]的联合应用
问题(解惑)
注意:内存单元为8位,但dx为16位
类型的匹配(8位和16位)和结果的不越界
最佳解决方案:以一个16位寄存器作为中介
1.每一次累加先将内存单元的值赋到ax中
2.再将ax加到dx中
5.6段前缀
若不指明内存单元的段地址,默认为ds
也可自己指定
如:
mov ax,cs:[0]
mov bx,es:[0]