杨季文 80x86汇编语言程序设计 实例一

这篇博客通过实例展示了80x86汇编语言中如何设计全局描述符表(GDT),并进行代码段和数据段的切换。博主详细解释了GDT的结构,包括LIMIT、BASE和ATTRIBUTES字段,并给出了定义和初始化GDT的代码。此外,还涉及到保护模式到实模式的转换,以及内存缓冲区的使用。
摘要由CSDN通过智能技术生成

 

JUMP MACRO selector,offsetv
     DB 0EAH
     DW offsetv
     DW selector
ENDM
    
ECHOCH MACRO ascii
     mov ah,2
     mov dl,ascii
     int 21h
ENDM
    
DESCRIPTOR STRUC
  LIMITL  DW  0
  BASEL   DW  0
  BASEM   DB  0
  ATTRIBUTES DW  0
  BASEH   DB  0
DESCRIPTOR ENDS

PDESC STRUC
  LIMIT  DW  0
  BASE   DD  0
PDESC ENDS

.386P
DATA SEGMENT USE16
  GDT LABEL BYTE
  DUMMY     DESCRIPTOR  <>
  CODE_DES  DESCRIPTOR  <0FFFFH,0,0,98H,0>
  CODE_SEL = CODE_DES - GDT
  DATAD_DES  DESCRIPTOR  <0FFFFH,0,0,92H,0>
  DATAD_SEL = DATAD_DES - GDT
  DATAS_DES  DESCRIPTOR  <0FFFFH,0,11H,92H,0>
  DATAS_SEL = DATAS_DES - GDT
  GDTLEN = $-GDT
 
  VGDTR  PDESC  <GDTLEN-1,0>
 
  BUFFERLEN = 256
  BUFFER DB BUFFERLEN DUP(0)
DATA ENDS

CODE SEGMENT USE16
     ASSUME CS:CODE,DS:DATA
START:
      MOV AX,DATA
      MOV DS,AX
     
      MOV BX,16
     
      MUL BX
      ADD AX,OFFSET GDT
      ADC DX,0
      MOV WORD PTR VGDTR.BASE,AX
      MOV WORD PTR VGDTR.BASE+2,DX
     
      MOV AX,CS
      MUL BX
      MOV CODE_DES.BASEL,AX
      MOV CODE_DES.BASEM,DL
      MOV CODE_DES.BASEH,DH
     
      MOV AX,DS
      MUL BX
      ADD AX,OFFSET BUFFER
      ADC DX,0
      MOV DATAD_DES.BASEL,AX
      MOV DATAD_DES.BASEM,DL
      MOV DATAD_DES.BASEH,DH
     
      LGDT QWORD PTR VGDTR
     
      CLI
      CALL EA20
     
      MOV EAX,CR0
      OR EAX,1
      MOV CR0,EAX
     
      JUMP <CODE_SEL>,<OFFSET VIRTUAL>
     
VIRTUAL:
      MOV AX,DATAS_SEL
      MOV DS,AX
      MOV AX,DATAD_SEL
      MOV ES,AX
      CLD
      XOR SI,SI
      XOR DI,DI
      MOV CX,BUFFERLEN/4
      REPZ MOVSD
     
      MOV EAX,CR0    
      AND EAX,0FFFFFFFEH
      MOV CR0,EAX
     
      JUMP <SEG REAL>,<OFFSET REAL>
REAL:
      CALL DA20
      STI
     
      MOV AX,DATA
      MOV DS,AX
      MOV SI,OFFSET BUFFER
      CLD
      MOV BP,BUFFERLEN/16
NEXTLINE:
      MOV CX,16
NEXTCH:
      LODSB
      PUSH AX
      SHR AL,4  
      CALL TOASCII
      ECHOCH AL
      POP AX
      CALL TOASCII
      ECHOCH AL
      ECHOCH ' '
      LOOP NEXTCH
      ECHOCH 0DH
      ECHOCH 0AH
      DEC BP
      JNZ NEXTLINE
     
      MOV AH,4CH
      INT 21H
     
TOASCII PROC
     and     al,0fh
     add     al,90h
     daa
     adc     al,40h
     daa
     ret

TOASCII ENDP

EA20 PROC
     PUSH AX
     IN AL,92H
     OR AL,2
     OUT 92H,AL
     POP AX
     RET    
EA20 ENDP

DA20 PROC
     PUSH AX
     IN AL,92H
     AND AL,0FDH
     OUT 92H,AX
     POP AX
     RET
DA20 ENDP

CODE ENDS
     END START
                   
 

第1章 预备知识 1.1 机器语言汇编语言 1.1.1 机器语言 1.1.2 汇编语言 1.1.3 书中使用符号的说明 1.2 Intel系列机简介 1.2.1 Intel 80X86微处理器简介 1.2.2 Intel 80X86微处理器结构 1.2.3 80X86的3种工作方式 1.3 主存储器和物理地址的形成 1.3.1 主存储器 1.3.2 堆栈 1.3.3 物理地址的形成 1.4 数据在计算机内的表示形式 1.4.1 数值数据在计算机内的表示形式 1.4.2 BCD码 1.4.3 字符数据在机内的表示形式 1.5 标志寄存器 1.5.1 标志位 1.5.2 标志寄存器操作指令 1.6 汇编源程序举例 第2章 寻址方式 2.1 寄存器寻址 2.2 寄存器间接寻址 2.3 变址寻址 2.4 基址加变址寻址 2.5 立即寻址 2.6 直接寻址 2.7 寻址方式的有关问题 2.8 寻址方式综合举例 第3章 宏汇编语言 3.1 宏汇编语言中的表达式 3.1.1 常量与数值表达式 3.1.2 变量、标号与地址表达式 3.2 常用的机器指令语句 3.2.1 数据传送指令 3.2.2 算术运算指令 3.2.3 位操作指令 3.3 伪指令语句 3.3.1 处理器选择伪指令 3.3.2 数据定义伪指令 3.3.3 符号定义伪指令 3.3.4 段定义伪指令 3.3.5 源程序结束伪指令 3.4 常用的DOS系统功能调用 3.4.1 概述 3.4.2 常用的输入/输出系统功能调用 3.5 MASM的功能 3.5.1 MASM的功能 3.5.2 汇编过程 3.5.3 汇编列表文件 3.5.4 符号交叉列表文件 第4章 程序设计的基本方法 4.1 概述 4.2 顺序程序设计 4.3 分支程序设计 4.3.1 转移指令 4.3.2 分支程序设计举例 4.4 循环程序设计 4.4.1 循环程序的结构和控制方法 4.4.2 单重循环程序设计 4.4.3 多重循环程序设计 4.5 子程序设计 4.5.1 子程序的概念 4.5.2 子程序的定义 4.5.3 子程序的调用与返回 4.5.4 子程序调用现场的保护方法 4.5.5 主程序与子程序之间传递参数的方式 4.5.6 子程序及其调用举例 4.5.7 子程序的嵌套 4.6 程序设计中的注意事项 第5章 程序设计的其他方法和技术 5.1 字符串操作 5.1.1 串操作指令简介 5.1.2 串操作指令 5.2 宏功能程序设计 5.2.1 宏定义 5.2.2 宏调用 5.2.3 宏定义与宏调用中的参数 5.2.4 重复汇编伪指令 5.2.5 条件汇编伪指令 5.2.6 宏库的使用 5.2.7 宏指令与子程序的比较 5.3 模块化程序设计 5.3.1 组合方式 5.3.2 通信方式 5.3.3 连接程序(LINK)的功能 5.3.4 地址分配文件举例 5.4 源程序综合举例 5.4.1 模块程序设计中的注意事项 5.4.2 模块程序设计举例 第6章 输入/输出和WIN32编程 6.1 输入/输出指令和数据的传送方式 6.1.1 输入/输出指令 6.1.2 数据的传送方式 6.2 中断与异常 6.2.1 中断的概念 6.2.2 中断矢量表 6.2.3 软中断及有关的中断指令 6.2.4 中断处理程序的设计 6.3 浮点运算 6.3.1 浮点数据格式 6.3.2 FPU中的寄存器 6.3.3 浮点指令与程序设计 6.4 WIN32编程 6.4.1 WIN32编程基础 6.4.2 WIN32程序的结构 6.4.3 Windows API函数简介 6.4.4 编程实例 第7章 上机操作 7.1 在DOS环境下运行汇编源程序的方法 7.1.1 在DOS环境下运行汇编源程序的必备软件 7.1.2 DOS环境下运行汇编源程序的流程 7.1.3 DOS环境下运行汇编源程序的命令(MASM 6.0及以下版本) 7.2 多模块程序的运行及子程序库的使用 7.2.1 多模块程序的运行 7.2.2 子程序库的使用 7.3 在Windows环境下运行汇编源程序的方法 7.3.1 在Windows环境下运行32位汇编源程序的必备软件 7.3.2 在Windows环境下运行汇编源程序的特点 7.3.3 在Windows环境下32位汇编源程序的运行命令 7.4 调试程序Turbo Debugger的使用 7.4.1 TD的启动和退出 7.4.2 利用TD调试汇编语言程序 7.4.3 调试举例 附录 附录Ⅰ ASCII码字符表 附录Ⅱ 80X86指令系统简表 附录Ⅲ 伪指令表 附录Ⅳ DOS的软中断与系统功能调用 附录Ⅴ 常用BIOS子程序的功能及其调用参数 附录Ⅵ 汇编连接程序错误信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值