美文网首页汇编语言程序员
包含多个段的程序:在代码段中使用数据

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

作者: 柠檬就是酸 | 来源:发表于2018-08-16 16:20 被阅读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后面的名称,然后拿着这个名称去前面找这个名称,找到了就是程序的入口处了。

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/wxjobftx.html