汇编语言程序员

包含多个段的程序:在代码段中使用数据

2018-08-16  本文已影响2人  柠檬就是酸

问题:

编程计算以下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后面的名称,然后拿着这个名称去前面找这个名称,找到了就是程序的入口处了。

上一篇下一篇

猜你喜欢

热点阅读