×
嵌入式 > 技术百科 > 详情

汇编入门学习笔记 (五)—— 包含多个段的程序

发布时间:2020-06-11 发布时间:
|
疯狂的暑假学习之  汇编入门学习笔记 (五)—— 包含多个段的程序

 

参考: 《汇编语言》 王爽 第6章

 

1.在代码中使用数据。

 
  1. assume cs:code  
  2.   
  3. code segment  
  4.   
  5.     dw 0123h,0456h,0789h,0defh  
  6.       
  7.     mov ax,0  
  8.     mov bx,0  
  9.   
  10.     mov ax,4c00H  
  11.     int 21h  
  12.   
  13. code ends  
  14.   
  15. end  

 

dw 表示定义字型数据,db 表示定义字节型数据。

上面代码编译连接,用debug调试,-u cs:0 查看汇编代码,发现没有看到 mov ax,0  mov bx,0 等。直接运行不正常。因计算机不知道那些是数据那些是代码。如果-u cs:8 就可以看到mov ax,0  mov bx,0 等。

正确方法,要加上程序入口

 

  1. assume cs:code  
  2.   
  3. code segment  
  4.   
  5.     dw 0123h,0456h,0789h,0defh  
  6.       
  7. start:  mov ax,0  
  8.     mov bx,0  
  9.   
  10.     mov ax,4c00H  
  11.     int 21h  
  12.   
  13. code ends  
  14.   
  15. end start  

start可以改成其他的名字,只要入口处和end 后面的一样就行了。

 

 

2.在代码中使用栈

 

例子:交换0123H 跟 0456H

dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 申请了栈的空间

sp 30H 设置 栈顶的起始位置

 

  1. assume cs:code  
  2.   
  3. code segment  
  4.     dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h  
  5.     dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0  
  6.       
  7. start:  mov ax,cs  
  8.     mov ss,ax  
  9.     mov sp,30h  
  10.           
  11.     push cs:[0]  
  12.     push cs:[2]  
  13.           
  14.     pop cs:[0]  
  15.     pop cs:[2]  
  16.           
  17.     mov ax,4c00h  
  18.     int 21h  
  19.           
  20. code ends  
  21.   
  22. end start  


 

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

 

例子:将数据段中的数据,倒叙存放

  1. assume cs:code,ds:data,ss:stack  
  2.   
  3. data segment  
  4.     dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h  
  5. data ends  
  6.   
  7. stack segment  
  8.     dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0  
  9. stack ends  
  10.   
  11. code segment      
  12.   
  13. start:  mov ax,data  
  14.         mov ds,ax  
  15.         mov ax,stack  
  16.         mov ss,ax  
  17.         mov sp,20h  
  18.           
  19.         mov bx,0  
  20.         mov cx,8  
  21.     s:  push  [bx]  
  22.         add bx,2  
  23.         loop s  
  24.       
  25.         mov bx,0  
  26.         mov cx,8  
  27.     s0: pop  [bx]  
  28.         add bx,2  
  29.         loop s0  
  30.       
  31.           
  32.         mov ax,4c00h  
  33.         int 21h  
  34.           
  35. code ends  
  36.   
  37. end start  

 

这里定义了三个段,数据段,栈段,代码段。ds,ss的值需要在代码段中指定。

 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ADI 高精度低功耗精密放大器