x86保护模式 实模式与保护模式切换实例
x86保护模式 实模式与保护模式切换实例
;名称:386SCD.INC
;功能:符号常量等的定义
;----------------------------------------------------------------------------
;IFNDEF __386SCD_INC //宏定义
;__386SCD_INC EQU 1
;----------------------------------------------------------------------------
.386P
;----------------------------------------------------------------------------
;打开A20地址线 宏定义
;----------------------------------------------------------------------------
EnableA20 MACRO // 使用32为地址线
push ax //ax压栈保存
in al,92h //读端口指令 92h端口的值送到al寄存器
or al,00000010b //处理al的值 将位1变为1
out 92h,al //写端口指令 将al的值送到92h 此时就是打开a20地址线
pop ax //弹出栈中的ax值
ENDM
;----------------------------------------------------------------------------
;关闭A20地址线
;----------------------------------------------------------------------------
DisableA20 MACRO
push ax
in al,92h
and al,11111101b //将位1置为0 就是关闭a20地址线
out 92h,al
pop ax
ENDM
;----------------------------------------------------------------------------
;16位偏移的段间直接转移指令的宏定义(在16位代码段中使用)
;----------------------------------------------------------------------------
JUMP16 MACRO Selector,Offset //宏定义: 【宏指令名】 MACRO 【形式参数,......】
DB 0eah ;操作码 //宏使用格式 【宏指令名】【实在参数】
DW Offset ;16位偏移量
DW Selector ;段值或段选择子
ENDM
;----------------------------------------------------------------------------
;32位偏移的段间直接转移指令的宏定义(在32位代码段中使用)
;----------------------------------------------------------------------------
COMMENT <JUMP32>
JUMP32 MACRO Selector,Offset //宏定义
DB 0eah ;操作码 //根据x86操作码结构和指令表 0eah的指令为jmpf
DD OFFSET //此时偏移为32位 选择子为16位
DW Selector ;段值或段选择子
ENDM
<JUMP32>
;-------------------------------------------------
JUMP32 MACRO Selector,Offset
DB 0eah ;操作码
DW OFFSET //此时偏移为16位
DW 0 //?高位是0 还是低位是0
DW Selector ;段值或段选择子 //选择子为16位
ENDM
;----------------------------------------------------------------------------
;16位偏移的段间调用指令的宏定义(在16位代码段中使用)
;----------------------------------------------------------------------------
CALL16 MACRO Selector,Offset //16位调用 宏定义
DB 9ah ;操作码 //操作码9ah 指令为callf
DW Offset ;16位偏移量
DW Selector ;段值或段选择子
ENDM
;----------------------------------------------------------------------------
;32位偏移的段间调用指令的宏定义(在32位代码段中使用)
;----------------------------------------------------------------------------
COMMENT <CALL32>
CALL32 MACRO Selector,Offset
DB 9ah ;操作码
DD Offset //偏移为32位
DW Selector ;段值或段选择子
ENDM
<CALL32>
;-------------------------------------------------
CALL32 MACRO Selector,Offset
DB 9ah ;操作码
DW Offset //偏移为16位
DW 0
DW Selector ;段值或段选择子
ENDM
;----------------------------------------------------------------------------
;存储段描述符结构类型定义
;----------------------------------------------------------------------------
Desc STRUC
LimitL DW 0 ;段界限(BIT0-15)
BaseL DW 0 ;段基地址(BIT0-15)
BaseM DB 0 ;段基地址(BIT16-23)
Attributes DB 0 ;段属性
LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)
BaseH DB 0 ;段基地址(BIT24-31)
Desc ENDS
;----------------------------------------------------------------------------
;门描述符结构类型定义
;----------------------------------------------------------------------------
Gate STRUC
OffsetL DW 0 ;32位偏移的低16位
Selector DW 0 ;选择子
DCount DB 0 ;双字计数 //参数 个数
GType DB 0 ;类型
OffsetH DW 0 ;32位偏移的高16位
Gate ENDS
;----------------------------------------------------------------------------
;伪描述符结构类型定义(用于装入全局或中断描述符表寄存器)
;----------------------------------------------------------------------------
PDesc STRUC //gdtr寄存器 idtr寄存器为48位
Limit DW 0 ;16位界限 //规定gdtr表的大小 项目
Base DD 0 ;32位基地址 //gdtr表的存储位置
PDesc ENDS
;----------------------------------------------------------------------------
;任务状态段结构类型定义
;----------------------------------------------------------------------------
TSS STRUC
TRLink DW 0 ;链接字段//是否被其他任务使用
DW 0 ;不使用,置为0
TRESP0 DD 0 ;0级堆栈指针 //不同级别的堆栈
TRSS0 DW 0 ;0级堆栈段寄存器
DW 0 ;不使用,置为0
TRESP1 DD 0 ;1级堆栈指针
TRSS1 DW 0 ;1级堆栈段寄存器
DW 0 ;不使用,置为0
TRESP2 DD 0 ;2级堆栈指针
TRSS2 DW 0 ;2级堆栈段寄存器
DW 0 ;不使用,置为0
TRCR3 DD 0 ;CR3 //cr3寄存器 分页机制使用
TREIP DD 0 ;EIP
TREFlag DD 0 ;EFLAGS
TREAX DD 0 ;EAX
TRECX DD 0 ;ECX
TREDX DD 0 ;EDX
TREBX DD 0 ;EBX
TRESP DD 0 ;ESP
TREBP DD 0 ;EBP
TRESI DD 0 ;ESI
TREDI DD 0 ;EDI
TRES DW 0 ;ES
DW 0 ;不使用,置为0
TRCS DW 0 ;CS
DW 0 ;不使用,置为0
TRSS DW 0 ;SS
DW 0 ;不使用,置为0
TRDS DW 0 ;DS
DW 0 ;不使用,置为0
TRFS DW 0 ;FS
DW 0 ;不使用,置为0
TRGS DW 0 ;GS
DW 0 ;不使用,置为0
TRLDTR DW 0 ;LDTR
DW 0 ;不使用,置为0
TRTrip DW 0 ;调试陷阱标志(只用位0)
TRIOMap DW $+2 ;指向I/O许可位图区的段内偏移
TSS ENDS
;----------------------------------------------------------------------------
;存储段描述符类型值说明 数据段和代码段
;----------------------------------------------------------------------------
ATDR EQU 90h ;存在的只读数据段类型值
ATDW EQU 92h ;存在的可读写数据段属性值
ATDWA EQU 93h ;存在的已访问可读写数据段类型值
ATCE EQU 98h ;存在的只执行代码段属性值
ATCER EQU 9ah ;存在的可执行可读代码段属性值
ATCCO EQU 9ch ;存在的只执行一致代码段属性值
ATCCOR EQU 9eh ;存在的可执行可读一致代码段属性值
;----------------------------------------------------------------------------
;系统段描述符类型值说明 门描述符 ldt tss 三种
;----------------------------------------------------------------------------
ATLDT EQU 82h ;局部描述符表段类型值
ATTaskGate EQU 85h ;任务门类型值
AT386TSS EQU 89h ;可用386任务状态段类型值
AT386CGate EQU 8ch ;386调用门类型值
AT386IGate EQU 8eh ;386中断门类型值
AT386TGate EQU 8fh ;386陷阱门类型值
;----------------------------------------------------------------------------
;DPL值说明 当前段的访问权限级别
;----------------------------------------------------------------------------
DPL0 EQU 00h ;DPL=0
DPL1 EQU 20h ;DPL=1
DPL2 EQU 40h ;DPL=2
DPL3 EQU 60h ;DPL=3
;----------------------------------------------------------------------------
;RPL值说明
;----------------------------------------------------------------------------
RPL0 EQU 00h ;RPL=0
RPL1 EQU 01h ;RPL=1
RPL2 EQU 02h ;RPL=2
RPL3 EQU 03h ;RPL=3
;----------------------------------------------------------------------------
;IOPL值说明
;----------------------------------------------------------------------------
IOPL0 EQU 0000h ;IOPL=0
IOPL1 EQU 1000h ;IOPL=1
IOPL2 EQU 2000h ;IOPL=2
IOPL3 EQU 3000h ;IOPL=3
;----------------------------------------------------------------------------
;其它常量值说明
;----------------------------------------------------------------------------
D32 EQU 40h ;32位代码段标志
GL EQU 80h ;段界限以4K为单位标志
TIL EQU 04h ;TI=1(局部描述符表标志)
VMFL EQU 00020000h ;VMF=1
VMFLW EQU 0002h
IFL EQU 00000200h ;IF=1
RFL EQU 00010000h ;RF=1(重启动标志,为1表示忽略调试故障)
RFLW EQU 0001h
NTL EQU 00004000h ;NT=1
;----------------------------------------------------------------------------
;分页机制使用的常量说明
;----------------------------------------------------------------------------
PL EQU 1 ;页存在属性位
RWR EQU 0 ;R/W属性位值,读/执行
RWW EQU 2 ;R/W属性位值,读/写/执行
USS EQU 0 ;U/S属性位值,系统级
USU EQU 4 ;U/S属性位值,用户级
;----------------------------------------------------------------------------
;ENDIF
2.实例源程序
;名称:ASM1.ASM
;功能:演示实方式和保护方式切换(切换到16位代码段)
;----------------------------------------------------------------------------
INCLUDE 386SCD.INC //包含上面的定义的文件
;----------------------------------------------------------------------------
;字符显示宏指令的定义
;----------------------------------------------------------------------------
EchoCh MACRO ascii //dos系统功能调用int21h ah=02 表示显示输出
mov ah,2 //dl=输出字符
mov dl,ascii
int 21h
ENDM
;----------------------------------------------------------------------------
DSEG SEGMENT USE16 ;16位数据段
;----------------------------------------------------------------------------
GDT LABEL BYTE ;全局描述符表
DUMMY Desc <> ;空描述符
Code Desc <0ffffh,,,ATCE,,> ;代码段描述符 以下分别为8字节长 空为全0
DataS Desc <0ffffh,0,11h,ATDW,,> ;源数据段描述符
DataD Desc <0ffffh,,,ATDW,,> ;目标数据段描述符
;----------------------------------------------------------------------------
GDTLen = $-GDT ;全局描述符表长度 当前值-gdt首地址 为字节长度
VGDTR PDesc <GDTLen-1,> ;伪描述符 GDtr寄存器值 16位的界限值定义 基地址为空
;----------------------------------------------------------------------------
Code_Sel = Code-GDT ;代码段选择子 以下为定义16为选择子相对于与表首的偏移值
DataS_Sel = Datas-GDT ;源数据段选择子
DataD_Sel = DataD-GDT ;目标数据段选择子
;----------------------------------------------------------------------------
BufLen = 256 ;缓冲区字节长度
Buffer DB BufLen DUP(0) ;缓冲区
;----------------------------------------------------------------------------
DSEG ENDS ;数据段定义结束
;----------------------------------------------------------------------------
CSEG SEGMENT USE16 ;16位代码段
ASSUME CS:CSEG,DS:DSEG
;----------------------------------------------------------------------------
Start PROC
mov ax,DSEG
mov ds,ax //设置数据段寄存器 指向dseg定义处
;准备要加载到GDTR的伪描述符 //设置基地址 32位 界限已经定义过了
mov bx,16
mul bx //mul是进行无符号乘法的指令 ax*bx,结果高16位存dx 低16位存ax
//相当于ax的值向左移4位
add ax,OFFSET GDT ;计算并设置基地址 实模式下段寄存器左移4位变为20位的段基地址再加偏移
adc dx,0 ;界限已在定义时设置好 注意dx需要带进位 根据上一个操作
mov WORD PTR VGDTR.Base,ax//高16位
mov WORD PTR VGDTR.Base+2,dx//低16位 并且带进位 dx:ax共同组成32位的基地址
;设置代码段描述符
mov ax,cs
mul bx
mov WORD PTR Code.BaseL,ax ;代码段开始偏移为0
mov BYTE PTR Code.BaseM,dl ;代码段界限已在定义时设置好
mov BYTE PTR Code.BaseH,dh
;设置目标数据段描述符
mov ax,ds
mul bx ;计算并设置目标数据段基址
add ax,OFFSET Buffer
adc dx,0
mov WORD PTR DataD.BaseL,ax
mov BYTE PTR DataD.BaseM,dl
mov BYTE PTR DataD.BaseH,dh
;加载GDTR
lgdt QWORD PTR VGDTR
cli ;关中断 开中断sti
EnableA20 ;打开地址线A20
;切换到保护方式
mov eax,cr0
or eax,1 //cr0中的位0置为1
mov cr0,eax //进入保护模式
;清指令预取队列,并真正进入保护方式
JUMP16 Code_Sel,<OFFSET Virtual> //宏调用 实参:选择子,偏移值
Virtual: ;现在开始在保护方式下运行
mov ax,DataS_Sel
mov ds,ax ;加载源数据段描述符
mov ax,DataD_Sel
mov es,ax ;加载目标数据段描述符
cld //si di 变化方向 加还是减
xor si,si //si和di清零
xor di,di ;设置指针初值
mov cx,BufLen/4 ;设置4字节为单位的缓冲区长度 设置计数器
repz movsd ;传送双字
;切换回实模式
mov eax,cr0
and al,11111110b //最低位清0 进入实模式
mov cr0,eax
;清指令预取队列,进入实方式
JUMP16 <SEG Real>,<OFFSET Real>
Real: ;现在又回到实方式
DisableA20 开中断
sti //开中断
mov ax,DSEG
mov ds,ax
mov si,OFFSET Buffer //ds:si
cld
mov bp,BufLen/16 //bp 外循环次数 16行
NextLine: mov cx,16 //内循环次数 一行16个字符
NextCh: lodsb //目的地址的内容读到源地址 串操作 块读出指令
// 即目标地址为es:di 源地址为ds:si 字节为单位传送
push ax
shr al,1 //右移1位
call ToASCII //调用子程序 toascii
EchoCh al //宏展开 echoch
pop ax
call ToASCII
EchoCh al
EchoCh ' '
loop NextCh //计数器为16 为0时跳出
EchoCh 0dh //实参传递给宏
EchoCh 0ah
dec bp //外循环的次数减1
jnz NextLine
mov ax,4c00h //中断
int 21h
Start ENDP
;----------------------------------------------------------------------------
//子程序定义
ToASCII PROC //转换为ascii码
and al,0fh //al低4位不变 高四位 变为0
add al,90h //高4位变为9 低4位不变
daa //说明三
adc al,40h //带进位加法 al变为对应的ascii码
daa
ret
ToASCII ENDP
;----------------------------------------------------------------------------
CSEG ENDS ;代码段定义结束
;----------------------------------------------------------------------------
END Start
;名称:ASM2.ASM
;功能:演示实方式和保护方式切换(切换到32位代码段)
;----------------------------------------------------------------------------
INCLUDE 386SCD.INC
;----------------------------------------------------------------------------
DSEG SEGMENT USE16 ;16位数据段定义
;----------------------------------------------------------------------------
GDT LABEL BYTE ;全局描述符表
DUMMY Desc <> ;空描述符
Normal Desc <0ffffh,,,ATDW,,> ;规范段描述符
Code32 Desc <C32Len-1,,,ATCE,D32,> ;32位代码段描述符
Code16 Desc <0ffffh,,,ATCE,,> ;16位代码段描述符
DataS Desc <DataLen-1,0,10h,ATDR,,> ;源数据段描述符
DataD Desc <3999,8000h,0bh,ATDW,,> ;显示缓冲区描述符
Stacks Desc <StackLen-1,,,ATDW,,> ;堆栈段描述符
;----------------------------------------------------------------------------
GDTLen = $-GDT ;全局描述符表长度
VGDTR PDesc <GDTLen-1,> ;伪描述符
;----------------------------------------------------------------------------
SaveSP DW ? ;用于保存SP寄存器
SaveSS DW ? ;用于保存SS寄存器
;----------------------------------------------------------------------------
Normal_Sel = Normal-GDT ;规范段描述符选择子 ?
Code32_Sel = Code32-GDT ;32位代码段选择子
Code16_Sel = Code16-GDT ;16位代码段选择子
DataS_Sel = Datas-GDT ;源数据段选择子
DataD_Sel = DataD-GDT ;目标数据段选择子
Stacks_Sel = Stacks-GDT ;堆栈段描述符选择子
;----------------------------------------------------------------------------
DataLen = 16 //? 需要显示的数据长度
;----------------------------------------------------------------------------
DSEG ENDS ;数据段定义结束
;----------------------------------------------------------------------------
StackSeg SEGMENT PARA STACK USE16
StackLen = 256
DB StackLen DUP(0) //定义256个字节长度
StackSeg ENDS
;----------------------------------------------------------------------------
CSEG1 SEGMENT USE16 'REAL' ;16位代码段 貌似为实模式下调用
ASSUME CS:CSEG1,DS:DSEG
;----------------------------------------------------------------------------
Start PROC
mov ax,DSEG
mov ds,ax
;准备要加载到GDTR的伪描述符
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
;设置32位代码段描述符
mov ax,CSEG2 // 代码段开始偏移为0
mul bx
mov WORD PTR Code32.BaseL,ax
mov BYTE PTR Code32.BaseM,dl
mov BYTE PTR Code32.BaseH,dh
;设置16位代码段描述符
mov ax,CSEG3
mul bx
mov WORD PTR Code16.BaseL,ax ;代码段开始偏移为0
mov BYTE PTR Code16.BaseM,dl ;代码段界限已在定义时设置好
mov BYTE PTR Code16.BaseH,dh
;设置堆栈段描述符
mov ax,ss
mov WORD PTR SaveSS,ax //用来保存ss段寄存器中的值
mov WORD PTR SaveSP,sp //用来保存sp段寄存器中的值
movax,StackSeg
mulbxmovWORDPTR Stacks.BaseL,axmovBYTEPTR Stacks.BaseM,dlmovBYTEPTR Stacks.BaseH,dh;加载GDTRlgdtQWORDPTR VGDTR //加载伪描述符 到gdtr寄存器
cli;关中断EnableA20;打开地址线A20;切换到保护方式moveax,cr0oral,1movcr0,eax;清指令预取队列,并真正进入保护方式JUMP16Code32_Sel,<OFFSET SPM32> //跳转指令 传给宏JUMP16 实参值ToReal:;现在又回到实方式 movax,DSEG
movds,axmovsp,SaveSP
movss,SaveSS
DisableA20 //关闭a20地址线sti //打开中断movax,4c00h int21h
Start ENDP //程序的末尾;----------------------------------------------------------------------------
CSEG1 ENDS;代码段定义结束
;----------------------------------------------------------------------------
CSEG2 SEGMENTUSE32'PM32' //32位 代码段 保护模式下执行ASSUMECS:CSEG2
;----------------------------------------------------------------------------
SPM32 PROCmovax,Stacks_Sel
movss,ax //将堆栈的选择子装入到ss段寄存器movesp,StackLen //esp指向栈顶
movax,DataS_Sel //将源数据段选择子装入ds段寄存器
movds,ax movax,DataD_Sel //目的数据段选择子装入es寄存器
moves,axxoresi,esi //指针清零 用 ds:esixoredi,edi //用es:edimovecx,DataLen //计数器赋初值
cldNext:lodsb //块传送 si指向的字节内容写入al 算法过程看备注pushax 入栈CALL ToASCII //调用子程序 显示ascii码
movah,7shleax,16 //左移 16位popaxshral,4 //右移4位CALL ToASCII
movah,7stosd //将al的内容存入edi指向的内存单元中moval,20h //空格stosw //从ax读取出数据 存入edi指向的内存单元
//如果使用的是stosd 则将eax的内容存入edi指向的内存单元
loop Next //循环 ecx-1 直到ecx=0为止
JUMP32 Code16_Sel,<OFFSET SPM16> //跳转到16位代码段
SPM32 ENDP
;----------------------------------------------------------------------------
ToASCII PROC
and al,00001111b //高4位清0
add al,30h //加30h 0+30h=30h 对应的ascii码为0
cmp al,39h //比较低4位与9的大小
jbe Isdig //小于等于 39h 跳转 说明是数字 判断是数字还是字母
add al,7 //大于39h的就是字母 对应的
IsDig: ret
ToASCII ENDP
;----------------------------------------------------------------------------
C32Len = $
;----------------------------------------------------------------------------
CSEG2 ENDS
;----------------------------------------------------------------------------
CSEG3 SEGMENT USE16 'PM16' //16位代码段
ASSUME CS:CSEG3
;----------------------------------------------------------------------------
SPM16 PROC
xor si,si
mov di,DataLen*3*2
mov ah,7
mov cx,DataLen
AGain: lodsb //从di指向的内存地址 取数据存入al
stosw //读ax数据 写到edi指向的内存单元 ah为7
loop AGain //循环块传送 直到cx值为0
mov ax,Normal_sel //规范段选择子赋值
mov ds,ax
mov es,ax
mov ss,ax
mov eax,cr0 //准备实模式
and al,11111110b
mov cr0,eax
jmp FAR PTR ToReal //跳转到实模式
SPM16 ENDP
;----------------------------------------------------------------------------
CSEG3 ENDS
;----------------------------------------------------------------------------
END Start
注释
x86保护模式 实模式与保护模式切换实例的更多相关文章
- ASM:《X86汇编语言-从实模式到保护模式》第14章:保护模式下的特权保护和任务概述
★PART1:32位保护模式下任务的隔离和特权级保护 这一章是全书的重点之一,这一张必须要理解特权级(包括CPL,RPL和DPL的含义)是什么,调用门的使用,还有LDT和TSS的工作原理(15章着重 ...
- ASM:《X86汇编语言-从实模式到保护模式》第10章:32位x86处理器的编程架构
★PART1:32位的x86处理器执行方式和架构 1. 寄存器的拓展(IA-32) 从80386开始,处理器内的寄存器从16位拓展到32位,命名其实就是在前面加上e(Extend)就好了,8个通用寄存 ...
- ASM:《X86汇编语言-从实模式到保护模式》第8章:实模式下硬盘的访问,程序重定位和加载
第八章是一个非常重要的章节,讲述的是实模式下对硬件的访问(这一节主要讲的是硬盘),还有用户程序重定位的问题.现在整理出来刚好能和保护模式下的用户程序定位作一个对比. ★PART1:用户程序的重 ...
- ASM:《X86汇编语言-从实模式到保护模式》第9章:实模式下中断机制和实时时钟
中断是处理器一个非常重要的工作机制.第9章是讲中断在实模式下如何工作,第17章是讲中断在保护模式下如何工作. ★PART1:外部硬件中断 外部硬件中断是通过两个信号线引入处理器内部的,这两条线分别叫N ...
- ASM:《X86汇编语言-从实模式到保护模式》第15章:任务切换
15章其实应该是和14章相辅相成的(感觉应该是作者觉得14章内容太多了然后切出来了一点).任务切换和14章的某些概念是分不开的. ★PART1:任务门与任务切换的方法 1. 任务管理程序 14章的时候 ...
- ASM:《X86汇编语言-从实模式到保护模式》第11章:进入保护模式
★PART1:进入保护模式 1. 全局描述符表(Global Descriptor Table,GDT) 32位保护模式下,如果要使用一个段,必须先登记,登记的信息包括段的起始地址,段的 ...
- ASM:《X86汇编语言-从实模式到保护模式》1-4章:处理器,内存和硬盘基础
其实很久之前就学完了实模式了,但是一直没有总结,感觉现在直接在书上做笔记的弊端就是有些知识点不能很很深刻地记下来(毕竟手写最明显的优点就是能深刻地记住知识,但是就是用太多的时间罢了).一下内容都是一些 ...
- x86架构:实模式下的中断
https://www.cnblogs.com/Philip-Tell-Truth/p/5317983.html 这里有详细的过程说明.文字很多,为了方便阅读和理解,提炼了一些要点后归纳.整理了如 ...
- ASM:《X86汇编语言-从实模式到保护模式》第16章:Intel处理器的分页机制和动态页面分配
第16章讲的是分页机制和动态页面分配的问题,说实话这个一开始接触是会把人绕晕的,但是这个的确太重要了,有了分页机制内存管理就变得很简单,而且能直接实现平坦模式. ★PART1:Intel X86基础分 ...
随机推荐
- Ionic之button标签ng-click无反应解决
在使用Ionic中,使用按钮的ng-click事件,竟然点击没有反应,刚开始以为自己写得方法有问题才会不起作用,自己在点击之后就console.log()一个东西,但是console也是无法反应的.& ...
- netty-socketio即时通讯
jar包和依赖包在360云盘中:所有文件 > 学习 > jar包 > netty-socketio-1.7.10以及依赖 原文链接:http://www.cnblogs.com/al ...
- Cuda入门笔记
最近在学cuda ,找了好久入门的教程,感觉入门这个教程比较好,网上买的书基本都是在掌握基础后才能看懂,所以在这里记录一下.百度文库下载,所以不知道原作者是谁,向其致敬! 文章目录 1. CUDA是什 ...
- 【MATLAB 从零到进阶】day2 矩阵 数组
访问矩阵元素 >> A=[1,2,3;4,5,6;7,8,9]; >> x=A(2,3)% 双下标访问 x = 6 >> x=A(2)% 单下标访问 x = 4 单 ...
- mysql同步出现1062错误
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;slave start;show slave status \G执行多次,直到不会出现1062错误为止 或者: my.cnf s ...
- mysql命令行执行时不输出列名(字段名)
-N 即可 如:mysql -N -e "select * from test" 摘自:http://blog.csdn.net/eroswang/article/details/ ...
- 在使用线程池时应特别注意对ThreadLocal的使用
使用ThreadLocal并且有线程池时要特别注意,ThreadLocal是以线程为key的,而线程池里面的线程是会被重新利用的,所以如果有使用线程池并且使用ThreadLocal来保存状态信息时要特 ...
- EJB2.0版本的HelloWorld
EJB2.0版本的HelloWorld 虽然EJB3.1已经出来了,可是EJB2.0的项目还需要维护啊.下面写个简单EJB2.0的HelloWorld程序,练练手. 环境: JBoss 4.0 ...
- ajax传给springMVC数据编码集问题
前台 ajax: $.ajax("${pageContext.request.contextPath}/hello",// 发送请求的URL字符串. { dataType : &q ...
- UISearchBar clearButton
When the searchBar:textDidChange: method of the UISearchBarDelegate gets called because of the user ...