王爽《汇编语言》实验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:

???????

    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章写了)


文章作者: LouisZ
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 LouisZ !
  目录