5章:
1.loop指令:loop实现循环功能,cx存放循环次数。
cpu执行loop时,进行如下操作:cx=cx-1;判断cx是否为零,cx不为0,则转至标号处执行程序,cx为0则向下顺序执行。
格式:
{
mov cx,循环次数
标号:
循环的程序段
loop 标号
}
2
汇编源程序中,数字不能以字母开头。要在前面加0.如
mov ax,ffffh;错误
mov ax,0ffffh;正确,在字母前加0
3一段安全的空间:
注意:我们在纯DOS(实模式)下,可以不理会DOS,直接用汇编操作真实的硬件,因为运行在CPU实模式下的DOS没有能力对硬件系统做全面的检查。但是在Windows,Unix这些运行于CPU保护模式下的操作系统中,不理会操作系统而直接用汇编操作硬件是不可能的。
当直接向一段内存中写入内容时,这段内存不应该存放其他内存的数据或代码,dos方式,一般0:200·~0:2ff空间是空闲的,可以直接写入.
实验【bx】和loop的使用:
实验4:向内存0:200~0:23f依次传入数据0~63(3fh)
assume cs:code
code segment
mov ax,0020h;
mov ds,ax;设置(ds)=(0020h)
mov bl,0
mov cx,40h;设置循环40h次
s:
mov [bx],bx
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end
6章:
end可以通知程序的入口。如:标号......end 标号;标号处为程序的入口。
哪一条指令是程序的第一条指令,由可执行文件中的描述信息指明。可执行文件由描述信息和程序组成,程序源自于源程序中的汇编指令和数据。end start指明入口地址,存储在可执行文件描述信息中。
程序框架:
ASSUME CS:CODE
CODE SEGMENT
.......
......
START:
CODE ENDS;代码段结束
END START ;程序结束
6.3 将数据,代码,栈,放入不同的段中
把数据,代码,栈放到一个段混乱,且8086段空间是64k,所以建议放在不同的段中。
段名相当于一个标号,代表了段地址。所以指令mov ax data的含义就是将段名为data的段地址送进ax。
mov ds ,data错误,8086不允许将数值直接送进段寄存器。程序对段名的引用,如指令mov ds,data中的data,将被编译器处理为一个表示段地址的数值.
第7章
汇编中字符数据编译器转为相应的ASCII码。
大写->小写 or 00100000
小写->大写 and 11011111
A ASCII码:65,小写字母ASCII码值比大写字母大32(20h)
si 和di不能分成两个8位寄存器使用
第八章
总结一下寄存器寻址:
(1)8086中,只有si di bx bp可以用在[... ]中寻址。[ax] [cx] [cs] [dx]错误
(2)在[...]中这四个寄存器可以单独出现,或者只能以4种组合出现:bx+si,bx+di,bp+si,bp+di.
mov ax ,[bx+bp];错误
mov ax,[si+di];错误
(3)在[..]使用的bp默认段地址是ss。
机器指令处理的数据在什么地方?
机器指令这一层,不关心数据的值,而关心指令执行前一刻,它将处理的数据所在的位置。指令执行前,数据可以在:CPU内部,内存,端口。
指令要处理的数据有多长?
(1)寄存器指明数据尺寸。
(2)word ptr/byte ptr指明
(3)指令默认访问单元长度。
8.7 DIV指令:
被除数/除数
除数有8/16位,在reg或者内存单元中。
被除数默认在AX,DX中。除数8位,则在AX中,除数16位,则在DX,AX中,dx存放高16位。
结果:除数位8位,商在al中,余数在ah中。16位同理。
格式:div reg
div 内存单元
8.9dup 由编译器处理的符号,与db,dw ,dd等数据定义伪指令混合使用,进行数据的重复。
db 3 dup(0);定义了三个字节,值都是0,相当于db 0,0,0,3指的是重复3次。