1.[bx]与内存单元安全
[bx]是指 段地址在DS中,偏移地址在bx中的内存单元oop
2.loopdebug
用于描述循环code
3.咱们定义的描述性符号 "()"内存
寄存器: (ax/al)表示ax/al寄存器中的内容编译器
段寄存器: ((ds)*16+(bx))表示段地址为ds内容,偏移地址为bx内容的内存单元的内容asm
内存单元: (20000H)表示20000H内存单元中的内容编译
4.约定符号idata表示常量效率
mov ax,idata 表示mov ax,1 mov ax,2 等软件
mov ax,[idata] 表示mov ax,[1] mov ax,[2] 等
段寄存机不可用这种方式mov
5.1[BX]
mov ax,[bx] 把ds内容做为段地址,bx内容做为偏移地址的2个内存单元内容放到ax中
mov [bx],ax 把ax内容放到ds内容做为段地址,bx内容做为偏移地址的2个内存单元中
5.2 loop指令
格式: loop 标号
loop执行步骤:1.(cx)=(cx)-1 2.判断cx,不是0则转到标号位置执行
例:计算2的12次方
assume cs:code
code segment
mov ax,2
mov cx,11
s:add ax,ax
loop s
code ends
end
5.3用debug跟踪loop指令
debug 1.exe
-r
-t
-t
..
-p (int 21H用p执行)
1.若是想直接跳到CS:XX位置处执行用 -g XX
2.若是想在循环中跳出,即结束循环后停下等待-t, 使用-p命令
5.4 Debug和汇编编译器对指令的不一样处理
同一指令:
mov ax,[0] 在debug中表示把DS:0和DS:1的内存单元内容放到ax中
在masm中等于 mob ax,0
如何解决汇编源程序问题 :
1. mov bx,0 mov ax,[bx]
2. mov ax,DS:[0]
5.5 Loop和[bx]的联合应用
计算ffff:0-ffff:b内存单元之和存入dx中:
思考:1.结果存在dx中是否会超出范围? 一个内存单元存0-255 12个内存单元不会超出16位
2.内存单元值8位怎么累加到dx 16位中? 将8位放到al中,而后ax累加到dx中
程序:
assume cs:code
code segment
mov ax,0ffffH
mov ds,ax
mov ax,0H
mov bx,0H
mov dx,0H
mov cx,0CH
s:mov al,ds:[bx]
add dx,ax
inc bx
loop s
mov ax,4c00H
int 21H
code ends
end
5.6段前缀
mov ax,[bx] 表示将DS:bx地址字单元内容存到ax中
在汇编代码里[bx]能够加前缀: ds: cs: ss: es: 表示段地址在哪一个寄存器里,这些符号就是段前缀
5.7一段安全的内存空间
1.咱们须要向内存中写入内容
2.这段内存不能有数据,不然可能致使系统或其余软件出问题
3.00200H到002ffH这段空间通常不会被使用,因此向内存写入通常就写这里
5.8段前缀的使用
假设咱们要把ffff:0-ffff:b的内容复制到0:200-0:20b中:
1.取内容: mov al,[bx]
2.存内容: mov [bx],al
因为ffff和0 不在同一段里,因此取和存的时候ds须要来回切换 效率不高
咱们能够设置ds=ffff , es=0, mov al,ds:[bx] mov es:[bx],al 来提升效率