[关闭]
@guoxs 2016-06-11T00:02:03.000000Z 字数 1517 阅读 845

包含多个段的程序

汇编语言


在代码段中使用数据

  1. assume cs:code
  2. code segment
  3. dw 0123h,0456h,0789h,0abch,0defh,0cbah,0987h
  4. mov bx,0
  5. mov ax,0
  6. s: add ax,cs:[bx]
  7. add bx,2
  8. loop s
  9. mov ax,4c00h
  10. int 21h
  11. code ends
  12. end

程序第一行中的“dw"的含义是定义字型数据,即为“define word”。
用dw定义的数据处于代码段的最开始,所以偏移地址是0。程序运行时,它们的地址就是:CS:0 CS:2 CS:4...

使用debug -u 查看:
使用debug -u 查看
发现在代码段的开头看到一些奇怪的代码,其实这是dw中数据对应的代码。从第16个字节开始才是汇编语言对应的机器码。
要运行这段代码,需要将IP设置为0010,跳过数据段。

这样做比较麻烦,还有一个较为简单的方法:

  1. assume cs:code
  2. code segment
  3. dw 0123h,0456h,0789h,0abch,0defh,0cbah,0987h
  4. start mov bx,0
  5. mov ax,0
  6. s: add ax,cs:[bx]
  7. add bx,2
  8. loop s
  9. mov ax,4c00h
  10. int 21h
  11. code ends
  12. end start

添加start程序入口标记。程序在编译连接后,由end start指明程序的入口,被转化为一个入口地址,储存在可执行文件的描述信息中。该程序中偏移地址部分为:10H。当程序被夹在到内存时,加载者从程序的可执行文件的描述信息中读到程序的入口地址,设置CS:IP。

有了这种方法,就可以这样安排程序的框架:

  1. assume cs:code
  2. code segment
  3. ...
  4. ...
  5. 数据
  6. ...
  7. ...
  8. start:
  9. ...
  10. ...
  11. 代码
  12. ...
  13. ...
  14. code ends
  15. end start

在代码中使用栈

将上一个程序的数据逆序存放:

  1. assume cs:code
  2. code segment
  3. dw 0123h,0456h,0789h,0abch,0defh,0cbah,0987h
  4. ;用dw定义16个字型数据,在程序加载后,将取得16个字的内存空间
  5. ;存放16个数据,在后面的程序中当做栈来使用
  6. dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  7. start mov ax,cs
  8. mov ss,ax
  9. mov sp,30h ;设置栈顶ss:sp指向cs:30
  10. mov bx,0
  11. mov cx,8 ;循环8
  12. s: push cs:[bx]
  13. add bx,2
  14. loop s ;以上将代码段单元中的8个字型数据依次入栈
  15. mov bx,0
  16. mov cx,8
  17. s0: pop sc:[bx]
  18. add bx,2
  19. loop s0 ;出栈
  20. mov ax,4c00h
  21. int 21h
  22. code ends
  23. end start

将数据、代码、栈放在不同的段

  1. assume cs:code,ds:data,ss:stack
  2. data segment
  3. dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
  4. data ends
  5. stack segment
  6. dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  7. stack ends
  8. code segment
  9. start mov ax,stack
  10. mov ss,ax
  11. mov sp,20h ;设置栈顶ss:sp指向stack:20
  12. mov ax,data
  13. mov ds,ax ;ds指向data
  14. mov bx,0 ds:bx指向data段中的第一个单元
  15. mov cx,8 ;循环8
  16. s: push cs:[bx]
  17. add bx,2
  18. loop s ;以上将代码段单元中的8个字型数据依次入栈
  19. mov bx,0
  20. mov cx,8
  21. s0: pop sc:[bx]
  22. add bx,2
  23. loop s0 ;出栈
  24. mov ax,4c00h
  25. int 21h
  26. code ends
  27. end start
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注