小结:实验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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值