问题:
编程计算以下8个数据的和,并将结果存放在ax寄存器中0123H、0456H、0789H、0abcH、0defH、0fdeH、0cbaH、0987H
代码:
assume cs:codeseg
codeseg segment
dw 0123H,0456H,0789H,0abcH,0defH,0fdeH,0cbaH,0987H
mov bx,0
mov ax,0
mov cx,8
s: add ax,cs:[bx]
add bx,2
loop s
mov ax,4c00H
int 21H
codeseg ends
end
调试:
使用r命令查看当前寄存器状态,然后使用d命令查看内存中是否存入这8个数据: 1.png 从调试结果来看,起始地址为076A的内存空间中,存放了16字节我们写入的数据。使用u命令查看16个字节以后的空间是否存入了我们写入的代码: 2.png遇到的问题:
使用u命令查看076A:0的内容,可以看出来是: 3.png也就是说,把我们想要相加的数据当成了命令来看,而我们此时想要程序从mov bx,0处开始执行,这时如果不进行更改,程序就会错误。
解决办法
在源程序中指明界序的入口所在,也就是加上段名,修改程序如下:
assume cs:codeseg
codeseg segment
dw 0123H,0456H,0789H,0abcH,0defH,0fdeH,0cbaH,0987H
zhao:mov bx,0
mov ax,0
mov cx,8
s: add ax,cs:[bx]
add bx,2
loop s
mov ax,4c00H
int 21H
codeseg ends
end zhao
注意程序增加的地方是zhao:和end后面的zhao,这样子程序就会从zhao:进入开始执行,和end zhao配成一对,中间是执行的指令。zhao这个名字可以随意换
end的作用
end除了通知编译器程序结束外,还有一很重要的功能是通知编译器程序的入口在什么地方,意思是程序在执行时,先找见end后面的名称,然后拿着这个名称去前面找这个名称,找到了就是程序的入口处了。
网友评论