5.5 编写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
c segment
db 0,0,0,0,0,0,0,0
c ends
code segment
start:
???????
code ends
end start
思路分析:
由于可以用 段:偏移 访问到具体物理地址的数据,所以这段程序直接用此方法,写一个循环,循环8次,将a段的程序与b段程序相加,存到c段程序中。
注意:由于当一个数据段不足16字节时,也分配16个字节的空间,其余的补0,这是因为在计算机系统中字节对齐方式更有利于访问内存,而牺牲了部分内存空间。
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
mov bx,0
mov cx,8
s:mov al,[bx]
add al,[bx+16]
mov [bx+32],al
inc bx
loop s
mov ax,4c00H
int 21H
code ends
end start
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
5.6编写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 ;占用32个字节,低址为数据,高址补0
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 ;相对偏移量为16进制的10H,是相对于ss而言
mov cs,8
s:push [bx] ;压栈是将数据先压到高址,然后向地址方向移动,即完成逆序存储
add bx,2
loop s
mov ax,4c00H
int 21H
code ends
end start
最终结果如下方数据,由于环境不同,段地址可能不相同
076C:0000 01 00 02 00 03 00 04 00-05 00 06 00 07 00 08 00
076C:0010 09 00 0A 00 0B 00 0C 00-0D 00 0E 00 0F 00 FF 00
076C:0020 08 00 07 00 06 00 05 00-04 00 03 00 02 00 01 00