1.结论
(1)若未指定程序的入口,程序载入后cs指向第一个段,ip=0;
若指定了程序的入口,程序载入后cs指向指定入口的那个段的段地址,ip等于入口相对段地址的偏移
(2)一个段的大小至少为16字节,最大为64k字节,因为计算地址时有 段地址*16 的步骤。
(3)若段的数据有n字节,则程序加载后,该段实际占有的空间为(n/1 6+1)*16(n/16取整数部分)
(4)只有bx可以作为基址寄存器的偏移地址寄存器,也就是只有bx有[bx]的写法
(5)add, mov, sub等双目操作指令, 至少有一个操作数是寄存器, 也就是说cpu不能直接对内存进行运算,要在cpu内部即寄存器中转
2.源码
(1)
;将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
c segment
db 0, 0, 0, 0, 0, 0, 0, 0
c ends
code segment
start:
mov ax, a
mov ds, ax ;ds指向a段
mov ax, c
mov es, ax
mov cx, 8
mov bx, 0
s: mov al, [bx]
mov es:[bx], al
inc bx
loop s ;将a段内容复制到c段
mov ax, b
mov ds, ax ;ds指向b段
mov cx, 8
mov bx, 0
s1: mov al, [bx]
add es:[bx], al
inc bx
loop s1
mov ax, 4c00H
int 21H
code ends
end start
(2)
;用push指令将a段中word数据逆序存入b段
assume cs:code
a segment
dw 1, 2, 3, 4, 5, 6, 7, 8
a ends
b segment
dw 0, 0, 0, 0, 0, 0, 0, 0
b ends
code segment
start:
mov ax, a
mov ds, ax ;ds指向a段
mov ax, b
mov ss, ax
mov sp, 16 ;ss:sp指向b+16
mov cx, 8
mov bx, 0
s: push [bx]
add bx, 2
loop s
mov ax, 4c00H
int 21H
code ends
end start