设为首页 加入收藏

TOP

微机原理与系统设计笔记4 | 汇编语言程序设计与其他指令(一)
2023-07-23 13:29:38 】 浏览:73
Tags:计笔记 程序设 计与其

  • 打算整理汇编语言与接口微机这方面的学习记录。本部分介绍汇编语言程序设计以及一些跟程序设计密切相关的指令类。

  • 参考资料

    • 西电《微机原理与系统设计》周佳社
    • 西交《微机原理与接口技术》
    • 课本《汇编语言与接口技术》王让定
    • 小甲鱼《汇编语言》

1. 汇编程序结构/框架

  • 段定义伪指令

    程序不同的信息要定义在不同的段中,该指令就

    SEGNAME SEGMENT [定位类型][组合类型]['类别']
    	;段实体
    SEGNAME ENDS
    
    • 这里要注意首尾一致,也就是SEGNAME要一样。
    • 有SEGMENT就要有ENDS,像C语言大括号一样。
    • 定义了一个段名SEGNAME,就具备了段地址属性。

    定位类型是告诉汇编器这个逻辑段起始地址的要求,取值有:

    1

    常用是PARA 节型。

    组合类型是多模块程序设计中告诉链接器器,不同模块中同段名同组合类型的逻辑段如何链接。

    课程只要求单模块编程,所以组合类型不了解也罢。

    老师这里提了STACK型(说明本段是堆栈段),例子:

    STACK SEGMENT STACK
          DB 256 DUP(?)
    STACK ENDS	
    

    注意这里第一行的第二个STACK声明为组合类型后,就不需要在代码段设置SS和SP了,如果不写这个组合类型声明,代码段还是需要声明。

    另一个组合类型是NONE类型,缺省型。其他的暂且不提。

    类别,如果要写,需要加上单引号说明,只告诉程序员这个段是干什么的,类似于段前注释,没有其他用处。

2. 8086汇编程序完整结构

;定义堆栈
STACK SEGMENT STACK
      DB 256 DUP(?)
      ;定义堆栈段,找16可以整除的,SP = 栈底+1
TOP LABEL WORD 
;TOP为变量名;TOP 不占用内存位置,获取SP的地址;LABEL伪指令只有存储单元地址、类型属性但是不占内存位置
STACK ENDS

;定义数据段(可能有多个)
DATA SEGMENT 
;实体

DATA ENDS
X_BYTE LABLE BYTE;这样就可以直接使用34H这个字节型变量X_BYTE,而不用对X_WORD进行类型转换。
X_WORD DW 1234H
;定义代码段
CODE SEGMENT 
ASSUME CS:CODE,DS:DATA,ES:DATA;段寻址伪指令,告诉汇编程序段名和段的关系
ASSUME SS:STACK
;这种关系是承诺关系,并没有向这些寄存器赋值,还需要再赋值

START:MOV AX,DATA
      MOV DS,AX;数据初始化,不能直接DATA给DS
	  MOV ES,AX
  /*  MOV AX,STACK
	  MOV SS,AX 
	  MOV SP,OFFSET TOP*/
	  ;相当于STACK组合类型的作用
/*    MOV AH,4CH
      INT 21H */   
      ;DOS系统的4CH对应的中断子程序,此处是结束用户程序返回操作系统
CODE ENDS;代码段结束
END START(CS:IP);整个程序结束
;初始化CS,ip,放置这段代码。其实是交给OS来做了,用户无权。

3. 其他伪指令

上面的完整程序结构中已经提了很多伪指令,简单提一提其他伪指令。

  • EQU 和 = 伪指令

    VAR_NAME EQU/= Exp;给表达式赋一个名称
    ;用EQU定义时,这个VAR_NAME只能EQU定义一次,用=定义则可以再次定义
    
  • ORG伪指令

    ORG 表达式
    

    为后续指令指定段内偏移地址,可以人为使字型数据对齐。

    举个例子:操作系统中的boot.asm中对于 org07c00h是这样注释的:“告诉编译器程序加载到7c00h处”:

    org 07c00h
    ;告诉编译器程序加载到7c00h处
    mov ax,cs
    mov ds,ax
    mov es,ax
    
    call screen
    jmp $
    
    screen:mov ax,bootmsg
    mov bp,ax
    mov cx,16
    mov ax,01301h
    mov bx,000ch
    mov dl,0
    int 10h
    ret
    
    bootmsg:db'Hello OS world!' 
    times 510-($-$$) db 0 
    dw 0xaa55
    

想直接听后面的了,不想听前面的指令系统了,折磨。

4. 子程序设计及其调用返回指令

这部分是3.11和4.5合在一起讲,前者是子程序调用返回指令,后者是子程序程序设计。

子程序/过程就是汇编语言里的函数,将一些功能性、重复性的代码放到子程序中调用,可以让自己的代码更加清晰。我们需要在主干代码调用子程序,在子程序结束时返回

4.1 子程序指令

  • 子程序定义:

    以过程形式定义:

    son_name1 PROC [类型] 
    	;主体
    	RET;子程序返回,段间子程序可以用RETF
    son_name1 ENDP
    

    上面代码中的[类型]:

    • 段内子程序:NEAR,可以缺省
    • 段间子程序:FAR,不能缺省

    以标号形式定义(比较方便):

    LABEL:
    	;主体
    	RET
    
  • 子程序调用与返回

    • 段内子程序调用与返回

      CODE SEGMENT
           ASSUME CS:CODE
      START:
      
      	 ……
      	CALL SUB1;段内直接寻址
      	; call near sub1的near可以缺省
      	; ……CS不发生改变
      	
      	MOV AH,4CH
          INT 21H	
      	
      SUB1 PROC
      	RET
      SUB1 ENDP
      CODE ENDS 
      END START
      
      • 执行call时,IP放入堆栈(SP-2)字单元;
      • IP+DISP(到跳转标号的相对位移)得到新的IP;
      • RET 执行后,栈顶弹出放回IP,SP+2;
    • 段间子程序调用与返回

      CODE1 SEGMENT
           ASSUME CS:CODE1
      START:
      
      	 ……
      	CALL FAR PTR SUB1;段内直接寻址
      	 ;……CS:IP(CS和IP都要保存)
      	
      	MOV AH,4CH
          INT 21H	
      CODE1 ENDS
      
      CODE2 SEGMENT
      	ASSUME CS:CODE2
      SUB1 PROC FAR
      	……
      	RETF;也可以直接写为RET
      SUB1 ENDP; 子程序/过程结束指令
      CODE2 ENDS
      
      • 执行call时,cs先入栈(sp-2),ip再入栈(sp-2),
      • RET 时,完成CS IP出栈。
      • 这里注意一个事情,在子程序内使用了堆栈push pop后,需要在最后复原至调用初,才能将子程序正确返回。

4.2 信息的保护和恢复

也就是主程序和子程序会复用一些寄存器和存储器单元,调用子程序时需要保存主程序的这些东西,这个过程在主程序或子程序中都可以进行,通常在子程序中进行。

4.3 主程序和子程序的参数传递

寄存器、存储器、堆栈都能传递参数。

至于怎么传递,其实就是一个程序设计者自己规定的过程,比如主程序将参数放到AX,子程序从AX来拿。在堆栈参数传递参数方式时,需要用到BP指针。

4.4 子程序说明文件

作为学生,这部分当然不写,了解一下吧。

  1. 子程序名
  2. 子程序功能
  3. 入口参数与传递方式
  4. 出口参数与传递方式
  5. 子程序用到的寄存器

4.5 嵌套、递归、可再用

  • 嵌套子程序设计时注意堆栈溢出
  • 设计自上而下,调试自下而上,保证调用的程序无问题
  • 递归子程序:自己调用自己,需要考虑出口条件
  • 可再用是一种提醒,感觉子程序可再用有点复杂,要在一次调用还未结束时又调用该子程序,要注意正确返回。

这一节偏实践,纸上论道不可取。用到再说吧,个人汇编编程经验感觉子程序这部分不难,

首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇AT24C02 by stm32f103 hal 下一篇痞子衡嵌入式:i.MXRT中FlexSPI外..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目