小结:实验5 编写、调试具有多个段的程序

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


你可能感兴趣的:(汇编语言(王爽)学习记录)