在代码段中使用数据

发布时间 2023-07-29 11:23:34作者: fuchsiaOS

在代码段中使用数据

在汇编程序中,会遇到 dw ,这个的含义是定义一个字型数据(define word)。

假设有以下的汇编代码:

assume cs:code

code segment

;data
    dw 0000h,0001h,0002h,0003h,0010h

;program
    mov ax,0h
    mov bx,ax
    mov cx,ax
    mov dx,ax
    mov cx,5h
;looper
looper:  add ax,cs:[bx]
         add bx,21h
         loop looper

;quit program
    mov ax,4c00h
    int 21h

code ends

end

这里,我们定义了5个字型数据,他们所占用的内存空间大小为10个字节,并在 looper 中对这5个字节的数据进行累加,编译链接后,在 debug 中使用 u 查看指令,可以发现程序并不是如我们期待的那样子,这是因为对于前面所定义的数据,它也当做指令了。

无入口点

所以,为了解决这个问题,我们加入一个标识符用来说明程序开始执行的位置,这个标识符和代码最后一行的 end 相匹配,修改后的代码如下:

assume cs:code

code segment

;data
   dw 0000h,1111h,2222h,3333h,6666h

;program
__start: mov ax,0h
         mov bx,ax
         mov cx,ax
         mov dx,ax
         mov cx,5h
;looper
looper:  add ax,cs:[bx]
         add bx,21h
         loop looper

;quit program
   mov ax,4c00h
   int 21h

code ends


end __start

使用 __start 标识符,并且修改 end 为相匹配的 end __start,再次编译链接后,查看:

带有入口带你

使用 end __start 来表明程序的入口点为 __start 段,这样,程序被加载到内存后,就会从指定的位置开始运行。