【汇编语言】——第六章课后总结

1.在代码段中使用数据

assume cs:code
code segment
  dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
  mov bx,0
  mov ax,0
  movcx,9
s:addax,cs:[bx]
  add bx,2
  loop s
  mov ax,4c00h
  int 21h
code ends
end

dw的含义是定义字型数据(define word),使用dw定义 了8个字型数据,他们所占的内存空间大小为16个字节。

代码段偏移地址为0,2,4,6……,即CS:0,CS:2,CS:4,CS:6……CS:E。

程序中,用bx存放加2递增的偏移地址,用循环来进行累加。在循环开始前,设置(bx)=0,cs:bx指向第一个数据所在的字单元。每次循环中(bx)=(bx)+2,cs:bx指向下一个数据所在单元。

1.用start:放在程序开始处

2.在最后一个end处加上start(start只是标号,也可以自定字符)

end除了通知编译器程序结束,还通知编译器程序的入口在什么地方

end start指明程序的入口,被转化为入口地址,存储在可执行文件的描述信息中,加载时程序从描述信息中读到入口地址,设置CS:IP

程序框架:

assume cs:code

code segment


.....数据


start


.....代码


code ends

end start

2.在代码段中使用栈

assume cs:codesg
codesg segment
            dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h ;用dw定义16个字型数据,在程序加载后,将取得16个字的内存空间,0~f,存放这16个数据
            dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;在此处预留了32个字节作为栈,10~2f,在后面的程序将这段空间当作栈来使用
start:      mov ax,cs
            mov ss,ax
            mov sp,30h ;将栈顶ss:sp指向cs:30h
            
            mov bx,0
            mov cx,8
        s: push cs:[bx]
            add bx,2
            loop s        ;将代码段0~15单元的8个字型数据依次入栈
            
            mov bx,0
            mov cx,8
       s0: pop cs:[bx]
            add bx,2
            loop s0      ;依次出栈8个字型数据到代码段0~15单元中
codesg ends
end start

我们将cs:10~cs:2F的内存空间当作栈来用,初始状态下为空,所以ss:sp要指向栈底,即cs:30h。

3.将数据、代码、栈放入不同的栈

assume cs:code,ds:data,ss:stack

data segment

dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h

data ends

stack segment

dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

stack ends

code segment

start:mov ax,stack

     mov ss,ax

   mov sp,20h

   mov ax,data

   mov ds,ax

   mov bx,0

   mov cx,8

s:     push [bx]

   add bx,2

   loop s

   mov bx,0

   mov cx,8

s0:   pop [bx]

   add bx,2

   loop s0

   mov ax,4c00h

   int 21h

code ends

end start

1、不同段要有不同段名

2、段名相当于一个标号,代表了段地址,是数字形式而非寄存器形式,所以 mov ds,data错误

3、assume是伪指令,cs:code,ds:data,ss:stack,不会将相应寄存器和段code、stack、data链接

猜你喜欢

转载自www.cnblogs.com/hongyezhu/p/10018841.html