第三章 2.3实验

java2 实用教程第五版 第三章实例及课后题 第三天 java2 实用教程第五版 耿祥义 张跃平编著 第三章代码 代码1:课本P36 public class Example3_1 { public static void main(String[] args) { char a1='十',a2='点',a3='进',a4='攻'; char secret = 'A'; a1 = (char) (a1^secret); a... 阅读详情

 昨天赶时间去睡觉来,所以现在才把实验2,3一起写个总结。记得华姐说过,做报告就是对你实验的一个总结。那我写blog也是为了总结和以后回头看看自己走过的路。

好了,废话不多说了,继续。

实验2,3合起来有几个问题暂时还未能解决。

Q:;有三个问题,第一个是TestRead和TestWrite ,DispAL,DispReturn要放在段[SECTION .s32]里面
;  第二个问题是:显示还不能正确显示转换后的字符,为什么?
;对于NORMAL的真正作用暂时还没弄明白

还有TEST的正确用法。

TEST的用法:

格式:TEST OPRD1,   OPRD2

     这条指令和指令AND类似,也是把两个操作数进行按位“与”操作,但结果不送到操作数OPRD1里面,仅仅影响标志位。该指令执行以后,标志位ZF,PF,SF反映运算结果,标志CF和OF清0

    该指令通常用于检测某些位是否为1,但又不希望改变原操作数值的场合。

附代码:(里面有自己写的过程时候的想法或者是一些犯的错误)

;有三个问题,第一个是TestRead和TestWrite ,DispAL,DispReturn要放在段[SECTION .s32]里面
;  第二个问题是:显示还不能正确显示转换后的字符,为什么?
;对于NORMAL的真正作用暂时还没弄明白;
%include  "pm.inc"
org 0100h
  jmp LABEL_BEGIN

[SECTION .gdt]
;GDT
LABEL_GDT:   Descriptor 0, 0, 0
LABEL_DESC_CODE32:Descriptor 0, SegCode32Len - 1, DA_C +DA_32
LABEL_DESC_VIDEO: Descriptor 0B8000h, 0ffffh, DA_DRW
LABEL_DESC_DATA: Descriptor 0, DataLen -1,DA_DRW
LABEL_DESC_TEST: Descriptor  0500000h, 0ffffh,DA_DRW
LABEL_DESC_STACK: Descriptor 0, TopOfStack, DA_DRWA + DA_32
LABEL_DESC_NORMAL:Descriptor 0, 0ffffh, DA_DRW
LABEL_DESC_CODE16:Descriptor 0, Code16Len - 1,DA_C
LABEL_DESC_LDT: Descriptor 0, LDTLen - 1, DA_LDT ;LDT
 
;GDT END

GdtLen equ $ -LABEL_GDT
GdtPtr dw  GdtLen - 1
   dd  0

;GDT选择子 
SelectorCode32  equ LABEL_DESC_CODE32 - LABEL_GDT
SelectorVideo  equ LABEL_DESC_VIDEO - LABEL_GDT
SelectorData  equ LABEL_DESC_DATA - LABEL_GDT
SelcetorTest  equ LABEL_DESC_TEST - LABEL_GDT
SelectorStack  equ LABEL_DESC_STACK - LABEL_GDT
SelectorNormal  equ LABEL_DESC_NORMAL - LABEL_GDT
SelectorCode16  equ LABEL_DESC_CODE16 - LABEL_GDT
SelectorLDT   equ LABEL_DESC_LDT  - LABEL_GDT
;END OF [SECTION .gdt]


[SECTION .data1]
LABEL_DATA:
SPValueInRealMode dw 0
PMMessage: db "In protect mode now ^_^",0
OffsetPMMessage equ PMMessage -$$
StrTest:  db "ABCDEFGHIJKLMNOPQRSTUVWSYZ",0
OffsetStrTest equ StrTest - $$
DataLen  equ $ - LABEL_DATA
;END OF [SECTION .DATA1]


[SECTION .gs]
ALIGN 32
[BITS 32]
LABEL_STACK:
 times 512 db 0
TopOfStack equ $ - LABEL_STACK - 1

[SECTION .s16];漏掉了.后面的s
[BITS 16]
LABEL_BEGIN:
 mov ax, cs
 mov ds, ax
 mov es, ax
 mov ss, ax
 mov sp, 0100h
   mov [SPValueInRealMode], sp
 mov [LABEL_GO_BACK_TO_REAL+3], ax
 ;初始化32位代码段描述符
 xor eax, eax
 mov ax, cs
 shl eax, 4   
 add eax, LABEL_SEG_CODE32   ;加偏移加错了
 mov word [LABEL_DESC_CODE32 + 2], ax
 shr eax, 16
 mov byte [LABEL_DESC_CODE32+4], al
 mov byte  [LABEL_DESC_CODE32+7], ah

 ;初始化数据段描述符
 xor eax, eax
 mov ax, ds
 shl eax, 4
 add eax, LABEL_DATA
 mov word [LABEL_DESC_DATA + 2], ax
 shr eax, 16
 mov byte [LABEL_DESC_DATA+4],  al
 mov byte [LABEL_DESC_DATA+7],  ah
 ;Iinit code 16
 xor eax, eax
 mov ax, cs
 shl eax, 4
 add eax,   LABEL_SEG_CODE16
 mov word [LABEL_DESC_CODE16 + 2], ax
 shr eax, 16
 mov byte [LABEL_DESC_CODE16 + 4], al
 mov byte [LABEL_DESC_CODE16 + 7], ah
   ;Iinit STACK
 xor eax, eax
 mov ax, ss
 shl eax, 4
 add eax,   LABEL_STACK
 mov word [LABEL_DESC_STACK + 2], ax
 shr eax, 16
 mov byte [LABEL_DESC_STACK + 4], al
 mov byte [LABEL_DESC_STACK + 7], ah
   ;Init  LDT IN GDT
 xor eax, eax
 mov ax, ds
 shl eax, 4
 add eax, LABEL_LDT
 mov word [LABEL_DESC_LDT + 2], ax
 shr eax, 16
 mov byte [LABEL_DESC_LDT + 4], al
 mov byte [LABEL_DESC_LDT + 7], ah

 ;IInit  LDT 's  Descriptor    对于LDT里面的描述符为什么放在 .s16这个部分里面呢?
 xor eax, eax
 mov ax, ds
 shl eax, 4
 add eax, LABEL_CODE_A
 mov word [LABEL_LDT_DESC_CODE_A + 2], ax
 shr eax, 16
 mov byte [LABEL_LDT_DESC_CODE_A + 4], al
 mov byte [LABEL_LDT_DESC_CODE_A + 7], ah

  

 ;加载gdtr做准备

 

 xor eax, eax
 mov ax, ds
 shl eax, 4
 add eax, LABEL_GDT
 mov dword [GdtPtr+2], eax ;忘记+2

 lgdt [GdtPtr]

 cli

 in  al, 92h
 or  al,00000010b
 out 92h, al


 mov eax, cr0
 or  eax, 1
 mov cr0, eax


 jmp dword SelectorCode32:0

 [SECTION .s32]
 [BITS 32]

 LABEL_SEG_CODE32:
      mov ax, SelectorData
  mov ds, ax
  mov ax, SelcetorTest
  mov es, ax
  mov ax, SelectorVideo
  mov gs, ax
  mov ax, SelectorStack
  mov ss, ax
  mov esp, TopOfStack

     ;显示字符
;    push edi
;  push esi
  xor edi, edi
  mov edi, (80*10+10)*2
  xor esi, esi
  mov esi, OffsetPMMessage
  mov ah, 0ch
  cld
.1:  
  lodsb
  test al, al  ;只能跟al进行对比,需要查一下test的用法
  jz  .2
 
  mov [gs:edi], ax
  add edi, 2
  jmp .1
.2:
;  pop esi
;  pop edi
  
      call DispReturn
;  call TestRead
;  call TestWrite
;  call TestRead
;  call DispReturn
  ;Load LDT
  mov ax, SelectorLDT
  lldt ax

  jmp SelectorLDTCodeA:0

 TestRead:
 xor esi, esi
 mov ecx, 8
.loop:                  ;忘记写冒号
 mov al, [es:esi]
 call DispAL
 inc esi
 loop .loop

 call DispReturn
 ret
;TestRead结束

TestWrite:
 push esi
 push edi
 xor esi, esi
 xor edi, edi
 mov esi, OffsetStrTest
 cld
.1:
 lodsb
 test al, al  ;不能test al,0 为什么呢?
 jz .2
 mov [es:edi], al
 inc edi
jmp .1
.2:
 pop edi
 pop esi
 ret
;TestWrite结束

DispAL:
 push ecx
 push edx
 mov ah, 0CH
 mov dl, al
 shr al, 4
 mov ecx, 2
.begin:
 and al, 01111b
 cmp al, 9
 ja  .1
 add al, '0'
 jmp .2
.1:
 sub al, 0Ah
 add al, 'A'
.2:
 mov [gs:edi], ax
 add edi, 2

 mov al, dl
 loop .begin
 add edi, 2
 
 pop edx
 pop ecx

 ret
;****DispAL END

DispReturn:
 push eax;
 push ebx
 mov eax, edi
 mov bl, 160
 div bl
 and eax, 0ffh
 inc eax
 mov bl,160
 mul bl
 mov edi, eax
 pop ebx
 pop eax
 ret
;*******DispReturn END
 SegCode32Len equ  $ - LABEL_SEG_CODE32 ;上面的子程序不能放到其他位置,为什么呢?
;END OF[SECTION .S32]


 [SECTION .s16code]
 ALIGN 32
 [BITS 16]
 LABEL_SEG_CODE16:
 mov ax, SelectorNormal
 mov ds, ax
 mov es, ax
 mov fs, ax
 mov gs, ax
 mov ss, ax

 mov eax, cr0
 and al, 11111110b
 mov cr0, eax

 LABEL_GO_BACK_TO_REAL:
  jmp 0:LABEL_REAL_ENTRY
 Code16Len equ $ - LABEL_SEG_CODE16

[SECTION .real]
[BITS 16]
LABEL_REAL_ENTRY:
 mov ax, cs
 mov ds, ax
 mov es, ax
 mov ss, ax

 mov sp, [SPValueInRealMode]

 in  al, 92h
 and al, 11111101b
 out 92h, al

 sti

 mov ax, 4c00h
 int 21h
;REAL END
 ;***************

;LDT
[SECTION .ldt]
ALIGN 32
LABEL_LDT:
LABEL_LDT_DESC_CODE_A: Descriptor 0, CodeALen - 1, DA_C + DA_32
LDTLen  equ $ - LABEL_LDT

;LDT Selector
SelectorLDTCodeA  equ LABEL_LDT_DESC_CODE_A - LABEL_LDT + SA_TIL

;END OF SECTION .ldt

;CODEA
[SECTION .la]
ALIGN 32
[BITS 32]
LABEL_CODE_A:
 mov ax, SelectorVideo
 mov gs, ax

 mov edi, (80*2 + 0) * 2
 mov ah, 0ch
 mov al, 'L'
 mov [gs:edi], ax

 jmp SelectorCode16:0
CodeALen  equ $ - LABEL_CODE_A

;END OF SECTION .LA

【C/C++】C++实验 C++实验1.简单C++程序开发1.1 使用Visual C+ +建立一个标准C+ +控制台程序,并编译、运行。1.2 分别编写函数swap( ) 对二个整数进行交换,其参数分别为指针和引用类型,并在主函数中进行测试1.3 设计一个C++控制台程序,从键盘输入一个圆的半径,输出其周长和面积。2.类与对象2.1 声明一个树Tree类,有数据成员ages(树龄),构造函数Tree(int n=0)进行... 阅读详情

相关推荐

《计算机组成原理》实验报告——TEC-2实验系统——运算器实验

实验名称: TEC-2实验计算机运算器实验 实验地点:10-413 一.实验目的 1. 了解和掌握Am2901运算器的组成结构和工作原理; 2. 认识和掌握TEC-2机运算器的组成和工作原理; 3. 认识和掌握TEC-2机运算器相关控制信号的含义和使用方法; 二.实验原理 Am2901运算器 1.Am2901 芯片内部组成结构 AM2901 芯片是一个4位的...

无限迭代中...... 1万+

C++实验二

1. 声明一个树Tree类,有数据成员age(树龄)、构造函数、成员函数grow表示树龄的增加,成员函数showAge()显示对象树龄等。请初始化一棵18树龄的树,再分别调用其成员函数 进行测试。 #include <iostream> using namespace std; class Tree { public: Tree(int a):age(a){} vo...

baidu_41883884的博客 3257

BJFU_操作系统实验_实验1:进程调度/ 实验2:生产者与消费者/ 实验3:存储管理

文章目录操作系统实验操作系统实验1实验题目:实验1 进程调度一、实验目的二、实验内容三、实验要求操作系统实验2实验题目:实验2 生产者与消费者一、实验目的二、实验内容三、实验要求四、实验原理操作系统实验3实验题目:实验3 存储管理一、实验目的二、实验内容三、实验要求四、实验说明 操作系统实验 操作系统实验1 实验题目:实验1 进程调度 一、实验目的 (1)掌握处理机调度及其实现。 (2)掌握进程状态及其状态转换。 (3) 掌握进程控制块PCB及其作用。 二、实验内容 进程调度模拟程序:假设有10个进程需要在

雪地行进 5997

操作系统实践之第二章(实验环境升级)

其实上面的那个实验即使在实模式下也是可以实现的,并没有体现出保护模式的优势。我们知道实模式下寻址能力只有1M(因为能用的地址线只有20条),而保护模式下可以达到4G。而且前面的实验只是让程序进入了保护模式,我们可以在程序的末尾又再次跳转回实模式。 在进行这些美妙的跨越之前我们不得不再一次更新自己的调试环境。你可能想问为什么要更新环境,oh,Sweety,前面的方法都是把我们的程序写到引导扇区

其疾如风 其徐如林 侵略如火 不动如山 1万+

树莓派基础实验14:PS2操纵杆实验

一、介绍    操纵杆是一种输入设备,由一根可在基座上旋转,并向其控制的设备报告其角度或方向的操纵杆组成。操纵杆通常用于控制视频游戏和机器人。这里使用操纵杆PS2。 二、组件 ★Raspberry Pi 3主板*1 ★树莓派电源*1 ★40P软排线*1 ★PCF8591模数转换器模块*1 ★PS2操纵杆模块*1 ★双色LED模块*1 ★面包板*1 ★跳线若干 三、实验原理   该模块有由两个模拟输出(对应x和y坐标)和一个数字输出,表示是否在Z轴上按下。   在本实验中,我们将引脚VRx和VRy连接到

chinacqzgp的博客 6984

计算机网络原理 实验1《NS3路由模拟实验》

实验1《NS3路由模拟实验》 一、实验目的 了解NS3网络模拟器的基本操作; 学习采用距离矢量算法(Distance Vector Algorithm)的动态路由。 二、实验内容   本实验的主要实验过程分别是:搭建NS3平台的坏境和学习采用距离矢量算法(Distance Vector Algorithm)的动态路由。此外,在实验过程中需要同学们自学linux操作系统的安装和使用(可在虚拟机中...

渣渣的夏天 9355

【计算机网络】第三章:使用GNS3和VMWare搭建实验环境(Part2:VMWare环境)

CN.StudyLog.Ch3.Using GNS3 to build experimental environment.使用GNS3和VMWare搭建实验环境VMWare 网络虚拟机与GNS3的通讯 VMWare 网络 VPCS呢,有着比较简单的设备功能,拥有IP,子网掩码,网关等,能做一个ping的命令,但是也就仅此而已了,无法充当比较全面的实验对象。所以这里我们打算使用VMware来配置虚拟机。 如图,我们如果把两边的设备换成真正的虚拟机,那么可以实验的网络原理自然也就更清楚了。 那么我们需要首先

Chahot的博客 2233

实验四 OSPF路由实验

实验四 OSPF路由实验OSPF路由实验一、 实验目的二、实验要求三、实验环境四、实验步骤与内容4.3本次实验的思路:五、 实验总结 OSPF路由实验 一、 实验目的 1) 了解ospf协议的基本配置 2) 利用ensp实验平台完成路由器和交换机的基本配置 二、实验要求 在AR1和AR2之间运行OSPF路由协议,在AR2和AR3之间运行RIPv2协议,在AR2上的RIP和OSPF进程间交换路由信息...

rmcgo 6859

【Linux运维】第三章(2):yum的使用1-3章上机实验需求

1.将root用户的工作目录切换到/tmp/目录; cd /tmp 2.删除当前目录中的所有文件; rm -rf ./* 2.分别创建/benet/和/accp/两个目录; mkdir benet mkdir accp ls 3.创建1.txt 2.txt 3.txt三个文件到/benet/目录中; touch benet/1.txt touch benet/2.txt...

就叫一片白纸的博客 273

汇编实验2.2 分支、循环程序实验

编写一个程序,把AL寄存器中的两位十六进制数显示出来。编写一个程序,判别键盘上输入的字符;若是1-9字符,则显示之;若为A-Z或a-z字符,均显示'c';若是回车字符(其ASCII码为0DH),则自动结束程序,若为其它字符则不显示,循环等待新的字符输入。

被你发现啦(╯‵□′)╯炸弹!•••*~● 1186

【PTP】——PTPd2.3时间同步实验

一、关闭NTP时间同步 1.查看NTP状态 timedatectl status 2.关闭NTP服务 sudo timedatectl set-ntp false 可以看到Network time on已经处于no的状态。 二、PTPd2局域网中实验

Yang_XiaoYang的博客 1918

西安交大梁力上机实验第三章11,改进版,给定一个不多于5位的正整数,要求:1求它是几位数;2分别打印出每一位数字;3 按逆序打印出各位数

西安交通大学梁力上机实验第三章11改进版 给定一个不多于5位的正整数,要求:1求它是几位数;2 分别打印出每一位数字;3 按逆序打印出各位数 #include<bits/stdc++.h> using namespace std; int main() { int x=0,t=0,a=0,b,c,d,e; //输入的数是x,位数是t cout<<"请输入x:"<<endl; cin>>x; if(x>0 &&am

shangxianjiao的博客 694

C++实验2代码2.3

设计一个学生信息管理程序,管理8个学生信息,能够按学号查询输出指定学生的信息(姓名,课程,成绩),也能输出全部学生信息。要求:1)输出函数采用非成员函数形式,以对象指针为形参;2)在主函数中采用对象数组形式实例化8个学生对象;4)测试两种输出形式.

NEMU PA2 必做任务3 实验思路分享

本文包含NEMU实验(天津大学)中PA2必做任务3的完整实验思路,篇幅不长,但是也仅记录了这一个任务的思路,后续任务慢慢更新,仅为个人完整思路分享,欢迎指正!

Kingwell_的博客 2866

【TELEMAC V8P4】TELEMAC-2D 用户手册核心概念与应用场景速览

本文深入解析了TELEMAC-2D水动力模型的核心概念与应用。作为基于二维浅水方程的开源数值模拟工具,TELEMAC-2D广泛应用于河流动力学、洪水演进、污染物输运及泥沙运动模拟。文章结合用户手册与实战经验,详细拆解了其理论框架、关键物理过程(如湍流模型、干湿网格处理),并提供了从模型搭建、文件配置到典型场景(如工程评估、污染应急、洪水模拟)的实用指南,帮助用户快速掌握这一强大工具。

weixin_29200741的博客 163

Xilinx SDK工程编译、链接、调试注意事项

1、添加工程 启动SDK时选取workspace,如下图所示: 对应的workpace文件夹中会生成如下几个文件: 如果当前workspace是首次加载工程,SDK会进入启动界面 点击Import Project,导入已有工程 点击Browse,添加工程路径,一个完整的工程包含一个bsp文件夹,一个HW文件夹,和一个src文件夹(添加C功能函数) 点击Fini...

Autumn_He的博客 1万+

电路习题解答 第三章 3-1、3-2

你一直都在心间 247

基于gm/id方法的折叠式共源共栅放大器设计实践

本文详细介绍了基于gm/id设计方法进行折叠式共源共栅放大器设计的完整流程。该方法通过确定晶体管的跨导效率(gm/id)作为核心设计参数,将复杂的放大器设计转化为有明确路径的优化问题。文章以设计一个增益80dB、带宽1GHz的两级放大器为例,逐步拆解了从指标分解、关键晶体管工作点选取、到实战仿真与微调的全过程,特别强调了第二级设计对稳定性的影响以及相位裕度的调试技巧。

w8x9y0z1的博客 415

RIPV2实验

该实验具体要求如下图

weixin_53067234的博客 1682

802.1x之EAP-TLS测试方法

CA证书一般是由权威的认证机构发出,用来验证该机构签名的证书,持有CA证书的设备可以验证对端的证书是否由自己信任的机构颁发的。在我们内部使用证书时,我没可以自己充当CA认证机构,管理私钥和CA证书,使用他们签名服务器、客户端证书。2、使用证书请求文件server_csr.pem、CA私钥、CA公钥生成服务器证书(正常情况下自己不拥有CA私钥,是把证书请求文件发给认证机构,由认证机构返回证书)进行802.1x EAP-TLS认证时需要IPC、服务器分别存储CA证书、设备证书、私钥,通过交换证书实现身份验证。

写作是为了更好的思考 2164

FPGA上的时间数字转换器(TDC):详细概述及FPGA开发

本文对基于FPGA的时间数字转换器(TDC)进行了详细的概述,并提供了一个简单的示例代码,展示了如何在FPGA上实现TDC功能。在本文中,我们将详细概述基于FPGA的TDC,并提供相应的源代码示例,以帮助读者理解和实现这一功能。需要注意的是,这只是一个简单的示例,实际的TDC设计可能需要更多的功能和优化,以满足特定的需求。读取和重置:最后,测量结果可以通过读取计数器的值来获取,并且在每次读取后需要将计数器重置为零,以便进行下一次测量。TDC的基本原理是测量信号的到达时间与参考时钟之间的时间差。

EsqpWeller的博客 6868

【RK3568+PG2L50H开发板实验例程】FPGA部分 | DDR3 读写实验例程

本文介绍了DDR3读写测试实验,采用深圳市小眼睛科技有限公司的PG2L50H芯片开发板,搭载MT41K256M16 DDR3芯片(512MB容量)。实验使用PDS2022.2-SP6.4开发环境,详细说明了DDR3控制器的配置流程,包括IP核添加、参数设置(支持1066Mbps速率、16bit总线宽度)和管脚约束方法。实验现象通过LED状态显示:LED1/5常亮表示正常,LED3/4闪烁分别对应系统时钟正常和数据检测无误。实验验证了DDR3控制器的读写功能,为开发者提供了完整的配置参考方案。

MYMINIEYE的博客 1345

基于BEV(鸟瞰图)的3D检测:PointPillars与CenterPoint

基于BEV(鸟瞰图)的3D检测:PointPillars与CenterPoint​ ,人工智能,计算机视觉,大模型,AI,本文围绕基于BEV的3D检测,解析了PointPillars与CenterPoint两种算法。PointPillars用点柱特征编码网络处理点云,通过2D卷积网络提取特征,检测头为解耦头;CenterPoint将三维物体表为点,分两阶段检测,先找中心点及属性,再细化预测。两者都可借特定骨干网生成BEV特征图且基于BEV检测,但检测头设计和物体表示方式不同。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 27万+
上一篇: 保护模式第三章
下一篇: 3.3.6克勤可检用内存
醉醉酒
博客等级 码龄19年 9粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值