原题
编写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:
???????
mov ax,4c00h
int 21h
code ends
end start
思路
这个题有三个数据段,但是段寄存器只有ds,es两个。。。手上这本旧课本的主人写的笔记是拿ss当第三个 段寄存器,这。。。应该不行吧?想破头也想不通,遂谷歌之。
其中一种解决思路是引入更多的寄存器。比如si,di等。因为之前没有接触过这类寄存器, 不知道使用上有什么讲究,因此不采用这种思路。
还有一种思路是利用栈暂存段寄存器中的数据,暂时更改段寄存器指向的段,后面再恢复成原来的值。
核心代码:
push ds
mov ax,c
mov ds,ax
......
pop ds
这种思路虽然效率不太好,但是知识范围没有超纲。
最终代码如下
mov ax,a
mov ds,ax
mov ax,b
mov es,ax
mov ax,0
mov bx,0
s:mov al,[bx]
add al,es:[bx]
push ds
mov dx,c
mov ds,dx
mov [bx],ax
pop ds
inc bx
loop s
mov ax,4c00h
int 21h
补充
调试过程中,曾经利用ax来作为偏移量寻址,类似 mov bl,[ax] 这样的,但是编译时报错, 查阅资料发现16位处理器不能使用ax寻址,原因不知道。(书上貌似没写)(补充:在后面第8章写了)