学习时间:2015年6月1日----7月14日
学习者:易天曦
第五章 [BX]he LOOP指令
1.在DEBUG中,在默认的DS存在的情况下,可以直接使用[idata]来表示DS*15+[idata]。但是在编程语言中,就不行了。必须寻找一个中介,来代替这个数字,例如BX。
2.指令 INC 表示:自增;LOOP指令表示:先在CX中存放循环的次数,然后在执行LOOP指令的时候,先CX= CX- 1 ;然后判断CX是否是0.若不是,执行循环。
例子:执行a^b 。
mov ax,a
mov cx,b
s: add ax,ax
loop s
mov ax,4c00h
int 21h
执行a * b
mov ax,0
mov cx,b
s: mov ax,ax
loop s
mov ax,4c00h
int 21h
3.在debug中跟踪用loop指令实现的循环程序
assume cs:code
code segment
start: mov ax,0ffffh
mov ds,ax
mov bx,6
mov dx,0
mov cx,3
s: mov al,[bx]
mov ah,0
add dx,ax
loop s
mov ax,4c00h
int 21h
code ends
end start
需要注意的是:ffff前要加0。
4.loop和[bx]的联合应用
问题一:计算ffff:0---ffff:b单元中的数据的和,结果存在dx中。
assume cs:code
code segment
start: mov ax,0ffffh
mov ds,ax
mov bx,0
mov dx,0
mov cx,12
s: mov al,[bx]
mov ah,0
add dx,ax
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end start
5.一段安全的空间,一般的PC机,DOS方式下,DOS和其他合法的程序一般都不使用0:200~0:2ff的256个字节的空间。
6.短前缀的使用问题。
问题二:将内存中ffff:0~ffff:b单元中的数据复制到0:200~0:20b单元中。
assume cs:code
code segment
start: mov ax,0ffffh
mov ds,ax
mov bx,0
mov dx,0
mov cx,12
s: mov al,[bx]
mov ah,0
add dx,ax
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end start
第六章 包含多个段的程序
1.通过定义多个段来标识,把程序模块化。
assume cs:code,ds:data,ss:stack
data segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
data ends
stack segment
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,20h
mov ax,data
mov ds,ax
mov bx,0
mov cx,8
s: push [bx]
add bx,2
loop s
mov bx,0
mov cx,8
s0: pop [bx]
add bx,2
loop s0
mov ax,4c00h
int 21h
code ends
end start
实验一:编写code段中的代码,将a段和B段中的数据依次相加,将结果存放到c段。
assume cs:code
a segment
db 1,2,3,4,5,6,7,8
a ends
b segment
db 1,2,3,4,5,6,7,8
b ends
d segment
db 0,0,0,0,0,0,0,0
d ends
code segment
start: mov ax,a
mov ds,ax
mov bx,0
mov ax,b
mov es,ax
mov cx,8
s: mov al,[bx]
add es:[bx],al
inc bx
loop s
mov bx,0
mov ax,d
mov ds,ax
mov cx,8
s0: mov al,es:[bx]
mov [bx],al
inc bx
loop s0
mov ax,4c00h
int 21h
code ends
end start
运行结果:
实验二:编写code段中的代码,用push指令将a段中的前8个字型数据,逆序存储b到段中。
assume cs:code
a segment
dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh
a ends
b segment
dw 0,0,0,0,0,0,0,0
b ends
code segment
start: mov ax,a
mov ds,ax
mov bx,0
mov ax,b
mov ss,ax
mov sp,10h
mov cx,8
s: push [bx]
add bx,2
loop s
mov ax,4c00h
int 21h
code ends
end start
运行结果: