6.1 在代码段中使用数据

把以下8个数据和计算出来, 存在ax寄存器中
image.png

  1. assume cs:code;
  2. code segment; 数据段程序段地址是
  3. dw 0123h,0123h,0123h,0123h,0123h,0123h,0123h,0123h
  4. mov bx,0
  5. mov ax,0
  6. mov cx,8
  7. s: add ax,cs:[bx]
  8. add bx,2
  9. loop s
  10. mov ax,4c00h
  11. int 21h;
  12. code ends
  13. end

image.png
image.pngt
这种情况会有问题,程序的执行会CS:IP去执行,程序的入口不是执行指令, 添加指令入口伪指令

  1. assume cs:code
  2. code segment
  3. dw 0123h,0123h,0123h,0123h,0123h,0123h,0123h,0123h
  4. start: mov bx,0;添加start
  5. mov ax,0
  6. mov cx,8
  7. s: add ax,cs:[bx]
  8. add bx,2
  9. loop s
  10. mov ax,4c00h
  11. int 21h;
  12. code ends
  13. end start;添加start

6.2 在代码段中使用栈

将下面数据段的数据逆序存放
0001h,0002h,0003h,0004h,0005h,0006h,0007h,0008h

  1. assume cs:code
  2. code segment
  3. dw 0123h,0124h,0125h,0126h,0127h,0128h,0129h,012Ah
  4. dw 0000h,0000h,0000h,0000h,0000h,0000h,0000h,0000h
  5. start: mov ax,cs
  6. mov ss,ax
  7. mov sp,32; 栈底部设置
  8. mov bx,0
  9. mov cx,8
  10. s: push cs:[bx]
  11. add bx,2
  12. loop s; 循环入栈,循环到第四次有bug
  13. mov bx,0
  14. mov cx,8; 标记清理
  15. s0: pop cs:[bx]
  16. add bx,2
  17. loop s0; 循环出栈
  18. mov ax,4c00h
  19. int 21h;
  20. code ends
  21. end start;添加start

6.3 将数据,代码,栈放入不同的段

  • 放到一个段程序混乱
  • 数据多,栈空间大的时候,就不能放在一起 ``` assume cs:code,ds:data,ss:stack

data segment dw 0123h,0124h,0125h,0126h,0127h,0128h,0129h,012Ah data ends

stack segment dw 0000h,0000h,0000h,0000h,0000h,0000h,0000h,0000h stack ends

code segment start: mov ax,stack mov ss,ax mov sp,16;设置栈顶指向stack:16 mov ax,data mov ds,ax mov bx,0;ds:bx指向第一个单元 mov cx,8

  1. s: push [bx]
  2. add bx,2
  3. loop s
  4. mov bx,0
  5. mov cx,8
  6. s0: pop [bx]
  7. add bx,2
  8. loop s0
  9. mov ax,4c00h
  10. int 21h

code ends

end start ```

  1. 定义多个段的方法
    进行不同的命名
  2. 对段地址引用, data中的数据
    mov ax,data
    mov ds,ax
  3. 代码段, 数据段, 栈段
    完全是操作者来安排, code, data, stack只是命名