从零开始的汇编语言(3)
不要问为什么中间断了,问就是连接编译的部分忘写了,找时间会补上的(应该吧)
(…)与[…]与[bx]
[…](汇编语言规定)表示一个内存单元
(…)表示一个内存单元或寄存器里的内容(方便学习做出的约定)
第二个中mov ax [2],表示偏移地址为2,将存于ds寄存器中的段地址加该偏移地址,在这个地址里存的数据,赋到ax中。
注:inc bx 表示bx+1.(increase)
约定:符号idata表示常量
例:mov ax idata表示mov ax 1,mov ax 2,mov ax 3等
问题5.1:
Loop指令
loop功能:实现循环 为计数型循环,
当执行到loop指令时,程序会进行如下操作:
1、(cx)=(cx)-1;
2、判断cx的值
不为零则跳转到标号处执行程序
为零则向下执行
但cx中要提前存放循环次数,而且要定义一个标号,不然loop将不知道要跳转到何处。
测试程序
assume cs:code
code segment
mov ax,2
mov cx,11
s: add ax,ax
loop s
mov ax,4c00h
int 21h
code ends
end
该程序执行结果:2->4->8->16->32->64…
先masm 目标文件;
link 目标文件;
debug +u命令查看(选)
r命令查看寄存器(选)
t命令单步执行
loop指令实例:
1、2的乘方
2、计算123*236,将结果储存在ax中
mov ax,0
mov cx,236
s: add ax,123
loop s
额:loop指令再例:
问题:计算ffff:0006 字节单元中的数乘以3,结果储存在dx中。
答案:
注:在汇编源程序中,数据不能以字母开头,所以要在第三行数据ffff前面加0
要注意数据的越界问题,本题中ffff:0006 单元中的数是一个字节型数据,在0~255之间,用它和3相乘,结果不会大于65535 不会越界。