FS寄存器
汇编语言中各寄存器的作用
![汇编语言中各寄存器的作用](https://img.taocdn.com/s3/m/24fcbe0ccd7931b765ce0508763231126edb77f3.png)
汇编语言中各寄存器的作用汇编语言中各寄存器的作用4个数据寄存器(EAX、EBX、ECX和EDX)2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)6个段寄存器(ES、CS、SS、DS、FS和GS)1个指令指针寄存器(EIP) 1个标志寄存器(EFlags)1、数据寄存器数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。
32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。
对低16位数据的存取,不会影响高16位的数据。
这些低16位寄存器分别命名为:AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。
4个16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每个寄存器都有自己的名称,可独立存取。
程序员可利用数据寄存器的这种”可分可合”的特性,灵活地处理字/字节的信息。
寄存器AX和AL通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。
累加器可用于乘、除、输入/输出等操作,它们的使用频率很高;寄存器BX称为基地址寄存器(Base Register)。
它可作为存储器指针来使用;寄存器CX称为计数寄存器(Count Register)。
在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数;寄存器DX称为数据寄存器(Data Register)。
在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。
在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址,但在32位CPU中,其32位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据保存算术逻辑运算结果,而且也可作为指针寄存器,所以,这些32位寄存器更具有通用性。
2、变址寄存器32位CPU有2个32位通用寄存器ESI和EDI。
stm32寄存器
![stm32寄存器](https://img.taocdn.com/s3/m/465691ecdc3383c4bb4cf7ec4afe04a1b071b026.png)
stm32寄存器(一种算法,用以确认发送过程中是否出错)数据寄存器:CRC_DR可读写,复位值:0xFFFF FFFF;独立数据寄存器:CRC_IDR临时存放任何8位数据;控制寄存器:CRC_CR只零位可用,用于复位CRC,对其写1复位,由硬件清零;PWR电源控制(控制和管理电源)电源控制寄存器:PWR_CR控制选择系统的电源电源控制/状态寄存器:PWR_CSR睡眠或待机模式电源控制BKP备份寄存器(用以控制和管理备份数据)备份数据寄存器x:BKP_DRx (x = 1 … 10) 10个16位数据寄存器用以存储用户数据RTC时钟校准寄存器:BKP_RTCCR控制实时时钟的运行备份控制寄存器:BKP_CR控制选择清除备份数据的类型备份控制/状态寄存器:BKP_CSR对侵入事件的控制(时钟的选择、复位、分频)时钟控制寄存器(RCC_CR)各时钟状态显示时钟配置寄存器(RCC_CFGR)时钟分频时钟中断寄存器(RCC_CIR)控制就绪中断使能与否APB2外设复位寄存器(RCC_APB2RSTR) APB1外设复位寄存器(RCC_APB1RSTR) 复位APB各功能寄存器AHB外设时钟使能寄存器(RCC_AHBENR) AHB时钟使能控制APB2外设时钟使能寄存器(RCC_APB2ENR) APB1外设时钟使能寄存器(RCC_APB1ENR) APB1时钟使能控制备份域控制寄存器(RCC_BDCR)备份域时钟控制控制/状态寄存器(RCC_CSR)复位标志寄存器AHB外设时钟复位寄存器(RCC_AHBRSTR) 复位以太网MAC模块时钟配置寄存器2(RCC_CFGR2)时钟选择与分频(设置端口的功能)端口配置低寄存器(GPIOx_CRL) (x=A..E)端口配置高寄存器(GPIOx_CRH) (x=A..E)端口输入数据寄存器(GPIOx_IDR) (x=A..E)只读数据,读出IO口的状态端口输出数据寄存器(GPIOx_ODR) (x=A..E) 可读可写端口位设置/清除寄存器(GPIOx_BSRR) (x=A..E)端口位清除寄存器(GPIOx_BRR) (x=A..E)将某一端口清零端口配置锁定寄存器(GPIOx_LCKR) (x=A..E) 用于保护端口配值AFIO寄存器(将端口重映射到其它端口用以端口的第二功能)事件控制寄存器(AFIO_EVCR)选择时间输出端口与引脚复用重映射和调试I/O配置寄存器(AFIO_MAPR) 各寄存器功能引脚重映射选择外部中断配置寄存器1(AFIO_EXTICR1)外部中断配置寄存器2(AFIO_EXTICR2)外部中断配置寄存器3(AFIO_EXTICR3)外部中断配置寄存器4(AFIO_EXTICR4)外部中断引脚重映射选择EXTI 寄存器(外部中断控制器)中断屏蔽寄存器(EXTI_IMR)用于屏蔽或开放某一引脚的中断请求事件屏蔽寄存器(EXTI_EMR)用于屏蔽或开放某一引脚的事件上升沿触发选择寄存器(EXTI_RTSR)禁止或允许某一引脚的上升沿触发下降沿触发选择寄存器(EXTI_FTSR)禁止或允许某一引脚的下降沿触发软件中断事件寄存器(EXTI_SWIER)控制某引脚的软件中断挂起寄存器(EXTI_PR)显示某线的引脚有无触发请求DMA寄存器(脱离cpu的传输模式)DMA中断状态寄存器(DMA_ISR)中断情况标志器DMA中断标志清除寄存器(DMA_IFCR)手动清除标志位DMA通道x配置寄存器(DMA_CCRx)(x = 1…7)传输控制寄存器DMA通道x传输数量寄存器(DMA_CNDTRx)(x = 1…7)数据传输剩余数量存储器DMA通道x外设地址寄存器(DMA_CPARx)(x = 1…7)设置数据传输外设源或目标地址DMA通道x存储器地址寄存器(DMA_CMARx)(x = 1…7)设置存储器地址ADC寄存器(模数转换器)ADC状态寄存器(ADC_SR)AD转换标志寄存器ADC控制寄存器1(ADC_CR1)ADC控制寄存器2(ADC_CR2)设置AD转换的各种功能ADC采样时间寄存器1(ADC_SMPR1)ADC采样时间寄存器2(ADC_SMPR2)某通道选择固定的采样时间ADC注入通道数据偏移寄存器x (ADC_JOFRx)(x=1..4) 设置数据偏移量ADC看门狗高阀值寄存器(ADC_HTR)设置模拟看门狗的阀值高限ADC看门狗低阀值寄存器(ADC_LRT)设置模拟看门狗的阀值低限ADC规则序列寄存器1(ADC_SQR1)ADC规则序列寄存器2(ADC_SQR2)ADC规则序列寄存器3(ADC_SQR3)设置ADC顺序ADC注入序列寄存器(ADC_JSQR)ADC 注入数据寄存器x (ADC_JDRx) (x= 1..4)ADC数据结果寄存器ADC规则数据寄存器(ADC_DR)DAC寄存器(数模转换器)DAC控制寄存器(DAC_CR)DAC软件触发寄存器(DAC_SWTRIGR)DAC通道1的12位右对齐数据保持寄存器(DAC_DHR12R1) DAC 通道1的12位左对齐数据保持寄存器(DAC_DHR12L1) DAC通道1的8位右对齐数据保持寄存器(DAC_DHR8R1) DAC通道2的12位右对齐数据保持寄存器(DAC_DHR12R2) DAC通道2的12位左对齐数据保持寄存器(DAC_DHR12L2) DAC通道2的8位右对齐数据保持寄存器(DAC_DHR8R2)双DAC的12位右对齐数据保持寄存器(DAC_DHR12RD)双DAC的12位左对齐数据保持寄存器(DAC_DHR12LD)双DAC的8位右对齐数据保持寄存器(DAC_DHR8RD) DAC通道1数据输出寄存器(DAC_DOR1)DAC通道2数据输出寄存器(DAC_DOR2)TIM1和TIM8寄存器(高级的定时计数寄存器)TIM1和TIM8控制寄存器1(TIMx_CR1)TIM1和TIM8控制寄存器2(TIMx_CR2)TIM1和TIM8从模式控制寄存器(TIMx_SMCR)TIM1和TIM8 DMA/中断使能寄存器(TIMx_DIER) TIM1和TIM8状态寄存器(TIMx_SR)TIM1和TIM8事件产生寄存器(TIMx_EGR)TIM1和TIM8捕获/比较模式寄存器1(TIMx_CCMR1) TIM1和TIM8捕获/比较模式寄存器2(TIMx_CCMR2) TIM1和TIM8捕获/比较使能寄存器(TIMx_CCER) TIM1和TIM8计数器(TIMx_CNT) TIM1和TIM8预分频器(TIMx_PSC)TIM1和TIM8自动重装载寄存器(TIMx_ARR)TIM1和TIM8重复计数寄存器(TIMx_RCR)TIM1和TIM8捕获/比较寄存器1(TIMx_CCR1)TIM1和TIM8捕获/比较寄存器2(TIMx_CCR2)TIM1和TIM8捕获/比较寄存器3(TIMx_CCR3)TIM1和TIM8捕获/比较寄存器(TIMx_CCR4)TIM1和TIM8刹车和死区寄存器(TIMx_BDTR)TIM1和TIM8 DMA控制寄存器(TIMx_DCR)TIM1和TIM8连续模式的DMA地址(TIMx_DMAR)TIMx寄存器(控制定时器)控制寄存器1(TIMx_CR1)控制寄存器2(TIMx_CR2)从模式控制寄存器(TIMx_SMCR)DMA/中断使能寄存器(TIMx_DIER)状态寄存器(TIMx_SR)事件产生寄存器(TIMx_EGR)捕获/比较模式寄存器1(TIMx_CCMR1) 捕获/比较模式寄存器2(TIMx_CCMR2) 捕获/比较使能寄存器(TIMx_CCER)计数器(TIMx_CNT)预分频器(TIMx_PSC)自动重装载寄存器(TIMx_ARR)捕获/比较寄存器1(TIMx_CCR1)捕获/比较寄存器2(TIMx_CCR2)捕获/比较寄存器3(TIMx_CCR3)捕获/比较寄存器4(TIMx_CCR4)DMA控制寄存器(TIMx_DCR)连续模式的DMA地址(TIMx_DMAR)TIM6和TIM7寄存器(基本定时计数器)TIM6和TIM7控制寄存器1(TIMx_CR1)TIM6和TIM7控制寄存器2(TIMx_CR2)TIM6和TIM7 DMA/中断使能寄存器(TIMx_DIER)TIM6和TIM7状态寄存器(TIMx_SR)TIM6和TIM7事件产生寄存器(TIMx_EGR)TIM6和TIM7计数器(TIMx_CNT)TIM6和TIM7预分频器(TIMx_PSC)TIM6和TIM7自动重装载寄存器(TIMx_ARR)RTC寄存器(实时时钟)RTC控制寄存器高位(RTC_CRH)RTC控制寄存器低位(RTC_CRL)16.4.3 RTC预分频装载寄存器(RTC_PRLH/RTC_PRLL) 16.4.4 RTC 预分频器余数寄存器(RTC_DIVH / RTC_DIVL) RTC计数器寄存器(RTC_CNTH / RTC_CNTL)16.4.6 RTC闹钟寄存器(RTC_ALRH/RTC_ALRL)IWDG寄存器(独立看门狗,用以监督系统硬件的正常运行)键寄存器(IWDG_KR)预分频寄存器(IWDG_PR)重装载寄存器(IWDG_RLR)状态寄存器(IWDG_SR)窗口看门狗(WWDG)寄存器(用以监督软件的正常运行)控制寄存器(WWDG_CR)配置寄存器(WWDG_CFR)状态寄存器(WWDG_SR)FSMC寄存器(可变静态存储控制器)NOR闪存和PSRAM控制器寄存器SRAM/NOR闪存片选控制寄存器1…4 (FSMC_BCR1…4)SRAM/NOR闪存片选时序寄存器1…4 (FSMC_BTR1…4)SRAM/NOR闪存写时序寄存器1…4 (FSMC_BWTR1…4) NAND 闪存和PC卡控制器寄存器PC卡/NAND闪存控制寄存器2..4 (FSMC_PCR2..4)FIFO状态和中断寄存器2..4 (FSMC_SR2..4)通用存储空间时序寄存器 2..4 (FSMC_PMEM2..4)属性存储空间时序寄存器 2..4 (FSMC_PATT2..4)I/O空间时序寄存器4 (FSMC_PIO4)ECC结果寄存器2/3 (FSMC_ECCR2/3)SDIO寄存器(数据传输控制器)SDIO电源控制寄存器(SDIO_POWER) SDIO时钟控制寄存器(SDIO_CLKCR) SDIO参数寄存器(SDIO_ARG)SDIO命令寄存器(SDIO_CMD)SDIO命令响应寄存器(SDIO_RESPCMD) SDIO响应1..4寄存器(SDIO_RESPx)SDIO数据定时器寄存器(SDIO_DTIMER) SDIO数据长度寄存器(SDIO_DLEN)SDIO数据控制寄存器(SDIO_DCTRL SDIO数据计数器寄存器(SDIO_DCOUNT) SDIO状态寄存器(SDIO_STA)SDIO清除中断寄存器(SDIO_ICR)SDIO中断屏蔽寄存器(SDIO_MASK)SDIO FIFO计数器寄存器(SDIO_FIFOCNT) SDIO数据FIFO寄存器(SDIO_FIFO)USB寄存器(usb传输控制器)通用寄存器USB控制寄存器(USB_CNTR)USB中断状态寄存器(USB_ISTR)USB帧编号寄存器(USB_FNR)USB设备地址寄存器(USB_DADDR)USB分组缓冲区描述表地址寄存器(USB_BTABLE)端点寄存器USB 端点n寄存器(USB_EPnR), n=[0..7]缓冲区寄存器发送缓冲区地址寄存器n(USB_ADDRn_TX)发送数据字节数寄存器n(USB_COUNTn_TX)接收缓冲区地址寄存器n(USB_ADDRn_RX)接收数据字节数寄存器n(USB_COUNTn_RX)CAN 寄存器(邮箱控制寄存器)CAN控制和状态寄存器CAN主控制寄存器(CAN_MCR)CAN主状态寄存器(CAN_MSR)CAN发送状态寄存器(CAN_TSR)CAN接收FIFO 0寄存器(CAN_RF0R)CAN接收FIFO 1寄存器(CAN_RF1R)CAN中断使能寄存器(CAN_IER)CAN错误状态寄存器(CAN_ESR)CAN位时序寄存器(CAN_BTR)CAN邮箱寄存器发送邮箱标识符寄存器(CAN_TIxR) (x=0..2)发送邮箱数据长度和时间戳寄存器(CAN_TDTxR) (x=0..2)发送邮箱低字节数据寄存器(CAN_TDLxR) (x=0..2)发送邮箱高字节数据寄存器(CAN_TDHxR) (x=0..2)接收FIFO邮箱标识符寄存器(CAN_RIxR) (x=0..1)接收FIFO邮箱数据长度和时间戳寄存器(CAN_RDTxR) (x=0..1) 接收FIFO邮箱低字节数据寄存器(CAN_RDLxR) (x=0..1)接收FIFO邮箱高字节数据寄存器(CAN_RDHxR) (x=0..1)CAN过滤器寄存器CAN 过滤器主控寄存器(CAN_FMR)CAN 过滤器模式寄存器(CAN_FM1R)CAN 过滤器位宽寄存器(CAN_FS1R)CAN 过滤器FIFO关联寄存器(CAN_FFA1R)CAN 过滤器激活寄存器(CAN_FA1R)CAN 过滤器组i的寄存器x (CAN_FiRx) (互联产品中i=0..27,其它产品中i=0..13;x=1..2)SPI和I2S寄存器(串行外设接口控制器)SPI控制寄存器1(SPI_CR1)SPI控制寄存器2(SPI_CR2)SPI 状态寄存器(SPI_SR)SPI 数据寄存器(SPI_DR)SPI CRC多项式寄存器(SPI_CRCPR) SPI Rx CRC寄存器(SPI_RXCRCR)SPI Tx CRC寄存器(SPI_TXCRCR)SPI_I2S配置寄存器(SPI_I2S_CFGR) SPI_I2S预分频寄存器(SPI_I2SPR)I2C寄存器(数据传输寄存器)控制寄存器1(I2C_CR1)控制寄存器2(I2C_CR2)自身地址寄存器1(I2C_OAR1)自身地址寄存器2(I2C_OAR2)数据寄存器(I2C_DR)状态寄存器1(I2C_SR1)状态寄存器2 (I2C_SR2)时钟控制寄存器(I2C_CCR)TRISE寄存器(I2C_TRISE)USART寄存器(通用同步异步收发器)状态寄存器(USART_SR)数据寄存器(USART_DR)波特比率寄存器(USART_BRR)控制寄存器1(USART_CR1)控制寄存器2(USART_CR2)控制寄存器3(USART_CR3)保护时间和预分频寄存器(USART_GTPR) OTG_FS控制和状态寄存器(数据传输控制器)OTG_FS全局寄存器OTG_FS控制和状态寄存器(OTG_FS_GOTGCTL)OTG_FS中断寄存器(OTG_FS_GOTGINT)OTG_FS AHB配置寄存器(OTG_FS_GAHBCFG)OTG_FS_USB配置寄存器(OTG_FS_GUSBCFG)OTG_FS复位寄存器(OTG_FS_GRSTCTL)OTG_FS控制器中断寄存器(OTG_FS_GINTSTS)OTG_FS中断屏蔽寄存器(OTG_FS_GINTMSK)OTG_FS接收状态调试读/OTG状态读和POP寄存器(OTG_FS_GRXSTSR / OTG_FS_GRXSTSP)OTG_FS接收FIFO长度寄存器(OTG_FS_GRXFSIZ)OTG_FS非周期性TX FIFO长度寄存器(OTG_FS_GNPTXFSIZ)OTG_FS非周期性TX FIFO/请求队列状态寄存器(OTG_FS_GNPTXSTS)OTG_FS通用控制器配置寄存器(OTG_FS_GCCFG)OTG_FS控制器ID寄存器(OTG_FS_CID)OTG_FS主机周期性发送FIFO长度寄存器(OTG_FS_HPTXFSIZ) OTG_FS设备IN端点发送FIFO长度寄存器(OTG_FS_DIEPTXFx)(其中x是FIFO的编号,x=1…4)主机模式下的寄存器OTG_FS主机模式配置寄存器(OTG_FS_HCFG)OTG_FS主机帧间隔寄存器(OTG_FS_HFIR)OTG_FS主机帧号/帧时间剩余寄存器(OTG_FS_HFNUM)OTG_FS主机周期性发送FIFO/请求队列寄存器(OTG_FS_HPTXSTS)OTG_FS主机所有通道中断寄存器(OTG_FS_HAINT)OTG_FS主机所有通道中断屏蔽寄存器(OTG_FS_HAINTMSK)OTG_FS主机端口控制和状态寄存器(OTG_FS_HPRT)OTG_FS主机通道x特性寄存器(OTG_FS_HCCHARx)(此处x代码通道号,x = 0...7)OTG_FS主机通道x中断寄存器(OTG_FS_HCINTx)(其中x代表通道号,x=0...7,)OTG_FS主机通道x中断屏蔽寄存器(OTG_FS_HCINTMSKx)(其中x为通道号,x=0...7) OTG_FS主机通道x传输长度寄存器(OTG_FS_HCTSIZx)(其中x为通道号,x=0...7)设备模式下的寄存器OTG_FS设备配置寄存器(OTG_FS_DCFG)OTG_FS设备控制寄存器(OTG_FS_DCTL)OTG_FS设备状态寄存器(OTG_FS_DSTS)OTG_FS设备IN端点通用中断屏蔽寄存器(OTG_FS_DIEPMSK)OTG_FS设备OUT端点通用中断屏蔽寄存器(OTG_FS_DOEPMSK) OTG_FS设备所有端点中断寄存器(OTG_FS_DAINT)OTG_FS所有端点中断屏蔽寄存器(OTG_FS_DAINTMSK)OTG_FS设备V BUS放电时间寄存器(OTG_FS_DVBUSDIS)OTG_FS设备V BUS脉冲时间寄存器(OTG_FS_DVBUSPULSE)OTG_FS设备IN端点FIFO空中断屏蔽寄存器(OTG_FS_DIEPEMPMSK)OTG_FS设备控制IN端点0控制寄存器(OTG_FS_DIEPCTL0)OTG设备端点x控制寄存器(OTG_FS_DIEPCTLx)(其中x为端点号,x=1…3)OTG_FS设备控制OUT端点0控制寄存器(OTG_FS_DOEPCTL0) OTG_FS设备OUT端点x控制寄存器(OTG_FS_DOEPCTLx)(其中x为端点号,x=1…3) OTG_FS设备端点x中断寄存器(OTG_FS_DIEPINTx)(其中x为端点号,x=0…3)OTG_FS设备端点x中断寄存器(OTG_FS_DOEPINTx)(其中x为端点号,x=0…3)OTG_FS设备IN端点0传输长度寄存器(OTG_FS_DIEPTSIZ0)OTG_FS设备OUT端点0传输长度寄存器(OTG_FS_DOEPTSIZ0) OTG_FS设备端点x传输长度寄存器(OTG_FS_DIEPTSIZx)(其中x 为端点号,x=1…3) OTG_FS设备IN端点传输FIFO状态寄存器(OTG-FS_DTXFSTSx)(其中x为端点号,x=0…3)OTG_FS设备端点x传输长度寄存器(OTG_FS_DOEPTSIZx)(其中x 为端点号,x=1…3) OTG_FS电源和时钟门控寄存器(OTG_FS_PCGCCTL)以太网寄存器(通信传输控制器)MAC寄存器以太网MAC设置寄存器(ETH_MACCR)以太网MAC帧过滤器寄存器(ETH_MACFFR)以太网MAC Hash列表高寄存器(ETH_MACHTHR)以太网MAC Hash列表低寄存器(ETH_MACHTLR)以太网MAC MII地址寄存器(ETH_MACMIIAR)以太网MAC MII数据寄存器(ETH_MACMIIDR)以太网MAC流控寄存器(ETH_MACFCR)以太网MAC VLAN标签寄存器(ETH_MACVLANTR)以太网MAC远程唤醒帧过滤器寄存器(ETH_MACRWUFFR)以太网MAC PMT控制和状态寄存器(ETH_MACPMTCSR)以太网MAC中断状态寄存器(ETH_MACSR)以太网MAC中断屏蔽寄存器(ETH_MAIMR)以太网MAC地址0高寄存器(ETH_MACA0HR)以太网MAC地址0低寄存器(ETH_MACA0LR)以太网MAC地址1高寄存器(ETH_MACA1HR)以太网MAC地址1低寄存器(ETH_MACA1LR)以太网MAC地址2高寄存器(ETH_MACA2HR)以太网MAC地址2低寄存器(ETH_MACA2LR)以太网MAC地址3高寄存器(ETH_MACA3HR)以太网MAC地址3低寄存器(ETH_MACA3LR)MMC寄存器以太网MMC控制寄存器(ETH_MMCCR)以太网MMC接收中断寄存器(ETH_MMCRIR)以太网MMC发送中断寄存器(ETH_MMCTIR)以太网MMC接收中断屏蔽寄存器(ETH_MMCRIMR)以太网MMC发送中断屏蔽寄存器(ETH_MMCTIMR)以太网MMC1次冲突后发送”好”帧的计数器寄存器(ETH_MMCTGFSCCR)以太网MMC1次以上冲突后发送”好”帧的计数器寄存器(ETH_MMCTGFMSCCR)以太网MMC发送”好”帧的计数器寄存器(ETH_MMCTGFCR)以太网MMC CRC错误接收帧计数器寄存器(ETH_ MMCRFCECR) 以太网MMC对齐错误接收帧计数器寄存器(ETH_ MMCRFAECR) 以太网MMC接收帧”好”单播帧计数器寄存器(ETH_ MMCRGUFCR)27.8.3。
Windows 中 FS 段寄存器
![Windows 中 FS 段寄存器](https://img.taocdn.com/s3/m/d609ba54783e0912a2162a55.png)
代码运行在RING0(系统地址空间)和RING3(用户地址空间)时,FS 段寄存器分别指向GDT(全局描述符表)中不同段:在RING3下,FS段值是0x3B(这是WindowsXP下值;在Windows2000下值为0x38。
差别就是在XP下RPL=3);运行在RING0下时,FS段寄存器值是0x30。
下面以XP为例说说。
一. RING3下的FS当代码运行在Ring3下时,FS值为指向的段是GDT中的0x38段(RPL为3)。
该段的长度为4K,基地址为当前线程的线程环境块(TEB),所以该段也被称为“TEB段”。
WINXPSP1及以前的Windows2000等系统中,进程环境块(PEB)的地址固定为0X7FFDF000,该进程的第一个线程的TEB地址为0X7FFDE000,第二个TEB的地址为0X7FFDD000…..但是自从WindowsXP SP2开始PEB和TEB的地址都是随机映射的(详见博文:MiCreatePebOrTeb函数注释)。
下图是WindowsXP SP3下的TEB结构(大小为0XFB8):nt!_TEB+0x000 NtTib : _NT_TIB+0x000 ExceptionList : Ptr32+0x004 StackBase : Ptr32+0x008 StackLimit : Ptr32+0x00c SubSystemTib : Ptr32+0x010 FiberData : Ptr32+0x010 Version : Uint4B+0x014 ArbitraryUserPointer : Ptr32+0x018 Self : Ptr32 <——+0x01c EnvironmentPointer : Ptr32+0x020 ClientId : _CLIENT_ID+0x000 UniqueProcess : Ptr32+0x004 UniqueThread : Ptr32+0x028 ActiveRpcHandle : Ptr32+0x02c ThreadLocalStoragePointer : Ptr32+0x030 ProcessEnvironmentBlock : Ptr32 <—— +0x034 LastErrorValue : Uint4B+0x038 CountOfOwnedCriticalSections : Uint4B +0x03c CsrClientThread : Ptr32+0x040 Win32ThreadInfo : Ptr32……FS:[0X18]就是TEB所在的地址;FS:[0X30]就是PEB所在的地址。
新型FSK电力线收发器ST7540及其应用_王作东
![新型FSK电力线收发器ST7540及其应用_王作东](https://img.taocdn.com/s3/m/6e90c02d192e45361066f5c2.png)
新型FSK 电力线收发器ST7540及其应用王作东(辽河石油勘探局通信公司 辽宁盘锦 124010)摘 要:介绍了新型单片式FSK 电力线收发器ST 7540的特点及工作原理,并给出基于S T 7540的应用电路。
ST 7540采用半双工同步/异步FSK 通信方式,专为低压电力线数据传输而设计,较好地克服了低压电力线载波传输中的技术问题,可广泛应用于空间限制,成本敏感的家庭和建筑物自动化以及遥控监视系统。
关键词:电力线;数据传输;F SK ;ST 7540中图分类号:T M 73 文献标识码:B 文章编号:1004373X (2006)1305602FSK Power Line Transceiver ST7540and Its ApplicationW A NG Zuodong(Co mm unic a tions Co mpany ,Liaohe Pe tro leum Exploratio n Bureau ,Panjin ,124010,China )Abstract :T his paper intro duces the cha racteristics a nd principle o f FSK po wer line transceiver ST 7540,and gives an applied electric cir cuit of ST 7540.T he ST 7540is a half duplex sy nchr onous /asynchronous F SK modem de signed for pow er line co mmunication netw or k applica tions ,specifica lly fo r lo w vo ltag e po we r lines and da ta transmission desig n better o verco me the lo w v oltag e electricity transmission line car rie r technolog y ,w hich can be wide ly used in space co nst raints and co st sensitiveho me ,building automa tion and r emo te monito ring sy stems.Keywords :po we r line ;da ta transmission ;FSK ;S T 7540收稿日期:20060310 由意法半导体(ST )设计生产的新型电力线收发芯片ST 7540,支持多种独有或开放的FSK 调制技术通信协议,其中包括EHS 和KO NN EX (EN50090),可广泛应用于家庭和工业领域电力线通信,如供电公司的集中式抄表(AM R )业务。
浅谈一下FS段寄存器在用户层和内核层的使用
![浅谈一下FS段寄存器在用户层和内核层的使用](https://img.taocdn.com/s3/m/b725132010661ed9ad51f327.png)
菜鸟一枚,有一段时间不搞内核了,分享一下以前学习的结果,有不对的地方请各位指点,大牛飘过~~在R0和R3时,FS段寄存器分别指向GDT中的不同段:在R3下,FS段寄存器的值是0x3B,在R0下,FS段寄存器的值是0x30。
分别用OD和Windbg在R3和R0下查看寄存器(XP3),下图:FS寄存器的改变是从R3进入R0后和从R0退回到R3前完成的,也就是说:都是在R0下给FS赋不同值的。
(FS在R0和R3中是不同的值,在 KiFastCallEntry / KiSystemService中FS值由0x3B变成0x30在 KiSystemCallExit / KiSystemCallExitBranch / KiSystemCallExit2 中再将R3的FS恢复)一.R3与R0之间的互相转换代码:6nt!KiSystemService:808696a1 6a00 push 0808696a3 55 push ebp808696a4 53 push ebx808696a5 56 push esi808696a6 57 push edi808696a7 0fa0 push fs //旧的R3 下的FS 保存入栈808696a9 bb30000000 mov ebx,30h808696ae 668ee3 mov fs,bx //FS=0X30 FS 值变成了0X30.808696b1 64ff3500000000 push dword ptr fs:[0]808696b8 64c70500000000ffffffff mov dword ptr fs:[0],0FFFFFFFFh808696c3 648b3524010000 mov esi,dword ptr fs:[124h] //ESI=_ETHEAD808696ca ffb640010000 push dword ptr [esi+140h] //PreviousMode808696d0 83ec48 sub esp,48h808696d3 8b5c246c mov ebx,dword ptr [esp+6Ch]KiSystemCallExit部分代码代码:80869945 8d6550 lea esp,[ebp+50h]80869948 0fa1 pop fs // 恢复 FS 值8086994a 8d6554 lea esp,[ebp+54h]8086994d 5f pop edi8086994e 5e pop esi8086994f 5b pop ebx80869950 5d pop ebp80869951 66817c24088000 cmp word ptr [esp+8],80h二.R3下的FS当线程运行在R3下时,FS指向的段是GDT中的0x3B段。
深入研究 Win32 SEH
![深入研究 Win32 SEH](https://img.taocdn.com/s3/m/5ac168030740be1e650e9ac4.png)
深入研究 Win32 结构化异常处理本文关键字:SEH, Windows, VisualC摘要就像人们常说的那样,Win32 结构化异常处理(SEH)是一个操作系统提供的服务。
你能找到的所有关于 SEH 的文档讲的都是针对某个特定编译器的、建立在操作系统层之上的封装库。
我将从SEH 的最基本概念讲起。
Matt Pietrek 著董岩 译Victor 转载自 Xfocus 并整理在所有 Win32 操作系统提供的机制中,使用最广泛的未公开的机制恐怕就要数结构化异常处理(structured exceptionhandling,SEH)了。
一提到结构化异常处理,可能就会令人想起 _try、_finally 和 _except 之类的词儿。
在任何一本不错的 Win32 书中都会有对SEH 详细的介绍。
甚至连Win32 SDK 里都对使用 _try、_finally 和 _except 进行结构化异常处理作了完整的介绍。
既然有这么多地放都提到了 SEH,那我为什么还要说它是未公开的呢?本质上讲,Win32 结构化异常处理是操作系统提供的一种服务。
编译器的运行时库对这种服务操作系统实现进行了封装,而所有能找到的介绍SEH 的文档讲的都是针对某一特定编译器的运行时库。
关键字 _try、_finally 和 _except 并没有什么神秘的。
微软的 OS 和编译器定义了这些关键字以及它们的行为。
其它的 C++ 编译器厂商也只需要尊从它们定好的语义就行了。
在编译器的 SEH 层减少了直接使用纯操作系统的 SEH 所带来的危害的同时,也将纯操作系统的 SEH 从大家的面前隐藏了起来。
我收到过大量的电子邮件说他们都需要实现编译器级的 SEH 但却找不到公开的文档。
本来,我可以指着Visual C++ 和 Borlang C++ 的运行时库的源代码说看一下它们就行了。
但是,不知道是什么原因,编译器级的 SEH 仍是个天大的秘密。
EMSA5-FS产品手册说明书
![EMSA5-FS产品手册说明书](https://img.taocdn.com/s3/m/9fbb2ab9710abb68a98271fe910ef12d2af9a9ae.png)
产品手册EMSA5-FS产品手册简要描述32位,5流水线级,单发射,为功能安全设计的嵌入式处理器核。
概述EMSA5-FS是一个为功能安全而设计的处理器核。
容错处理器使用EMSA5的双实例或三实例,EMSA5是一种实现RISC-V指令集体系结构(ISA)的高效32位嵌入式处理器IP核。
哈佛体系结构EMSA5处理器按顺序实现单发射,顺序执行的5级流水线,支持RISC-V 32位base integer指令集(RV32I)或32位base embedded指令集(RV32E)。
EMSA5可以支持机器和用户特权模式,也可以选择标准乘法(M)、压缩(C)、控制和状态寄存器(Zicsr)和指令围栏(Zifencei)RISC-V扩展。
处理器核通过两个32位AHB lite总线(一个用于数据,一个用于指令)及其中断线与系统通信。
为满足最严格的功能安全要求而设计,EMSA5-FS实现了一个内存保护单元,采用模块冗余,使用纠错码(ECC),并提供了样本重置和安全管理器模块。
特权操作模式提供了一种机制,可以将应用程序用户模式进程彼此隔离,并将其与以计算机模式运行的受信任代码隔离。
高度可配置的内存保护单元支持内存分区,它通过限制对内存和内存映射模块(例如外围设备)的访问或特定类型的访问来提供保护。
ECC保护存储器和总线,模块冗余保护内部处理器模块。
最后,safety manager提供逻辑和时序监控,可以定制以满足最终应用程序的需求。
作为CAST处理器内核系列的一部分,EMSA5-FS处理器内核的设计易于重用,经过严格验证,并附带ISO 26262 ASIL-D Ready证书。
主要特点功能安全设计•ISO 26262 ASIL-D Ready设计•完整的认证包,包括FMEDA和SAM文件•故障安全功能:模块冗余、总线ECC保护、复位和安全管理器模块•内存保护单元,具有多达16个可配置大小的区域•版本:o EMSA5-FS-T(TMR),o EMSA5-FS-D(DMR)和o EMSA5-FS-L(DMR处于锁定状态)。
反调试技术总结(一)
![反调试技术总结(一)](https://img.taocdn.com/s3/m/7a3f7ae5bb0d4a7302768e9951e79b89680268b3.png)
反调试技术总结(⼀)1.IsDebuggerPresent()这个函数读取进程的PEB结构的BeingDebugged标志,每个进程都有⾃⼰的PEB(Process Environment Block,进程环境块),这个结构的0x02偏移处是BeingDebugged标志。
Windows在调⼊进程,创建线程时,操作系统都会为每个线程创建TEB,⽽且FS段寄存器总是被设置成FS:0指向线程的TEB数据,TEB结构的0x30偏移处是PEB。
mov eax, fs:[30]movzx eax,byte ptr [eax+2]就可以得到BeingDebugged的值了。
由于这个检查很简单,很容易识别,壳⼀般都会加上⼀些垃圾代码进⾏混淆。
破除这样的反调试,第⼀,可以⽤OD插件,第⼆,在OD加载程序后,可以在数据窗⼝ctrl+G查找fs:[30]+2,把第⼀个字节由01改为00,IsDebuggerPresent就检测不出了。
2.PEB.NtGlobalFlagPEB另⼀个成员被称作NtGlobalFlag(偏移0x68),壳也通过它来检测程序是否⽤调试器加载。
通常程序没有被调试时,NtGlobalFlag成员值为0,如果进程被调试这个成员通常值为0x70。
mov ebx, [fs:0x30]cmp dword [ebx+0x68], 0jne .debugger_found破解⽅法:a.可以将 PEB.NtGlobalFlag设为进程未被调试时的相应值。
var pebvar patch_addrmov peb,[7ffde000+30]lea patch_addr,[peb+68]mov [patch_addr],0b.OD的插件。
3.PEB.ProcessHeap.Flagspeb的另⼀个成员PEB.ProcessHeap.Flags也可以作为检测的标志,正常情况下,该标志应该为2,被调试时⼀般会被设为0x50000062.mov eax, fs:[30h]mov eax, [eax+18h] ;PEB.ProcessHeapmov eax, [eax+0ch] ;PEB.ProcessHeap.Flagscmp eax, 2jne .debugger_found4.PEB.ProcessHeap.ForceFlags进程堆⾥另外⼀个标志,ForceFlags,它也由⼀组标志组成,正常情况下,该值应为0,被调试时⼀般会被设为0x40000060。
汇编语言指令英文全称
![汇编语言指令英文全称](https://img.taocdn.com/s3/m/2605ec0d4a7302768e9939f7.png)
汇编指令英文全称1.通用数据传送指令MOV----> moveMOV dest,src ;dest←srcMOV指令把一个字节或字的操作数从源地址src传送至目的地址dest。
MOVSX---->extended move with sign dataMOVZX---->extended move with zero dataPUSH---->pushPOP---->pop进栈出栈指令PUSHA---->push allPOPA---->pop allPUSHAD---->push all dataPOPAD---->pop all dataBSWAP---->byte swapXCHG---->exchange交换指令用来将源操作数和目的操作数内容交换,操作数可以是字、也可以是字节,可以在通用寄存器与通用寄存器或存储器之间对换数据,但不能在存储器与存储器之间对换数据。
mov ax,1234h ;ax=1234hmov bx,5678h ;bx=5678hxchg ax,bx ;ax=5678h,bx=1234hxchg ah,al ;ax=7856hCMPXCHG---->compare and changeXADD---->exchange and addXLAT---->translate换码指令用于将BX指定的缓冲区中、AL指定的位移处的数据取出赋给AL。
2.输入输出端口传送指令IN---->inputOUT---->output3.目的地址传送指令LEA---->load effective addres有效地址传送指令mov bx,0400hmov si,3chlea bx,[bx+si+0f62h] ;BX=139EH这里BX得到的是主存单元的有效地址,不是物理地址,也不是该单元的内容。
FS寄存器
![FS寄存器](https://img.taocdn.com/s3/m/caf1a17327d3240c8447ef9e.png)
WinNT内核下内存采用保护模式,段寄存器的意义与实模式汇编下的意义不同了。
fs[0]就是异常入口队列的首指针(seh) 。
另外,FS存的是段选择子,而不是实模式下的高16位基地址。
struct _seh{
struct _seh * lpNextSeh;
LPVOID lpFuncEntry;
}
FS寄存器指向当前活动线程的TEB结构(线程结构)
偏移说明
000 指向SEH链指针
004 线程堆栈顶部
008 线程堆栈底部
00C SubSystemTib
010 FiberData
014 ArbitraryUserPointer
018 FS段寄存器在内存中的镜像地址
020 进程PID
024 线程ID
02C 指向线程局部存储指针
030 PEB结构地址(进程结构)
034 上个错误号
得到KERNEL32.DLL基址的方法
assume fs:nothing ;打开FS寄存器
mov eax,fs:[30h] ;得到PEB结构地址
mov eax,[eax + 0ch] ;得到PEB_LDR_DATA结构地址
mov esi,[eax + 1ch] ;InInitializationOrderModuleList
lodsd ;得到KERNEL32.DLL所在LDR_MODULE结构的InInitializationOrderModuleList地址
mov edx,[eax + 8h] ;得到BaseAddress,既Kernel32.dll基址。
汇编语言中DS, ES, SS, DI, SI, BP, SP, IP, FS 寄存器介绍
![汇编语言中DS, ES, SS, DI, SI, BP, SP, IP, FS 寄存器介绍](https://img.taocdn.com/s3/m/2215cd9e0029bd64793e2c06.png)
汇编语言中DS, ES, SS, DI, SI, BP, SP, IP, FS 寄存器介绍DS is called data segment register. It points to the segment of the data used by the running program. You can point this to anywhere you want as long as it contains the desired data.DS叫做段寄存器, 指向当前运行着的程序的数据段. 你可以把它指向任何你想要的地方, 只要那个地方有你想要的数据.ES is called extra segment register. It is usually used with DI and doing pointers things. The couple DS:SI and ES:DI are commonly used to do string operations.ES叫做额外的段寄存器. 它通常跟DI一起用来做指针使用. DS:SI和ES:DI配对时通常用来执行一些字符串操作.SS is called stack segment register. It points to stack segment.SS叫做栈段寄存器, 它指向栈段.The register SI and DI are called index registers. These registers are usually used to process arrays or strings.SI和DI两个寄存器叫做索引寄存器, 这两个寄存器通常用来处理数组或字符串.SI is called source index and DI is destination index. As the name follows, SI is always pointed to the source array and DI is always pointed to the destination. This is usually used to move a block of data, such as records (or structures) and arrays. These register is commonly coupled with DS and ES. SI叫做源索引寄存器, DI叫做目的索引寄存器. 正如它们的命名, SI通常指向源数组, DI 通常指向目的数组. 他们通常被用来成块地移动数据, 比如移动数组或结构体. SI和DI通常和DS和ES一起使用.The register BP, SP, and IP are called pointer registers.BP, SP, 和IP叫做指针寄存器.BP is base pointer, SP is stack pointer, and IP is instruction pointer. Usually BP is used for preserving space to use local variables.BP是基指针, SP是栈指针, IP是指令指针. 通常BP用来保存使用局部变量的地址.SP is used to point the current stack. Although SP can be modified easily, you must be cautious. It's because doing the wrong thing with this register could cause your program in ruin.SP用来指向当前的栈. 尽管SP可以被很容易地修改, 你还是一定要非常小心. 因为如果这个寄存器搞错了, 你的程序就毁了.IP denotes the current pointer of the running program. It is always coupled with CS and it is NOT modifiable.IP用来指示当前运行程序的当前指针. 通常和CS一起使用, IP是不允许修改的.So, the couple of CS:IP is a pointer pointing to the current instruction of running program. You can NOT access CS nor IP directly.所以, CS:IP配对用来指示当前运行的指令地址. 你不能直接访问CS, 也不能直接访问IP.FS和GS寄存器是从386开始才有的. FS主要用来指向Thread InformationBlock(TIB).。
Windows 中 FS 段寄存器
![Windows 中 FS 段寄存器](https://img.taocdn.com/s3/m/30e172c5240c844769eaee9e.png)
代码运行在RING0(系统地址空间)和RING3(用户地址空间)时,FS段寄存器分别指向GDT(全局描述符表)中不同段:在RING3下,FS段值是0x3B(这是WindowsXP下值;在Windows2000下值为0x38。
差别就是在XP下RPL=3);运行在RING0下时,FS段寄存器值是0x30。
下面以XP为例说说。
一. RING3下的FS当代码运行在Ring3下时,FS值为指向的段是GDT中的0x38段(RPL为3)。
该段的长度为4K,基地址为当前线程的线程环境块(TEB),所以该段也被称为“TEB段”。
WINXPSP1及以前的Windows2000等系统中,进程环境块(PEB)的地址固定为0X7FFDF000,该进程的第一个线程的TEB地址为0X7FFDE000,第二个TEB的地址为0X7FFDD000…..但是自从WindowsXP SP2开始PEB和TEB的地址都是随机映射的(详见博文:MiCreatePebOrTeb函数注释)。
下图是WindowsXP SP3下的TEB结构(大小为0XFB8):nt!_TEB+0x000 NtTib : _NT_TIB+0x000 ExceptionList : Ptr32+0x004 StackBase : Ptr32+0x008 StackLimit : Ptr32+0x00c SubSystemTib : Ptr32+0x010 FiberData : Ptr32+0x010 Version : Uint4B+0x014 ArbitraryUserPointer : Ptr32+0x018 Self : Ptr32 <——+0x01c EnvironmentPointer : Ptr32+0x020 ClientId : _CLIENT_ID+0x000 UniqueProcess : Ptr32+0x004 UniqueThread : Ptr32+0x028 ActiveRpcHandle : Ptr32+0x02c ThreadLocalStoragePointer : Ptr32+0x030 ProcessEnvironmentBlock : Ptr32 <——+0x034 LastErrorValue : Uint4B+0x038 CountOfOwnedCriticalSections : Uint4B+0x03c CsrClientThread : Ptr32+0x040 Win32ThreadInfo : Ptr32……FS:[0X18]就是TEB所在的地址;FS:[0X30]就是PEB所在的地址。
使用OllyDbg从零开始Cracking 第十九章-OllyDbg反调试之IsDebuggerPresent
![使用OllyDbg从零开始Cracking 第十九章-OllyDbg反调试之IsDebuggerPresent](https://img.taocdn.com/s3/m/c15c000c6edb6f1aff001f89.png)
第十九章-OllyDbg反调试之IsDebuggerPresent本章开始,我们将讨论反调试的相关话题,包括手工以及通过OD插件来绕过对应的反调试的技巧。
很多程序会检测自身是否正在被调试,如果检测到正在被调试的话,就会结束自身进程或者不按常规流程运行。
所以绕过程序对OD的检测是很有必要的。
本章就介绍使用API函数-IsDebuggerPresent检测OD,这也是最常用的检测调试器的方法。
这里,我们使用Crackme1.exe来讲解,用OD加载它。
我们记得我们的OD只安装了命令栏插件,并没有安装绕过IsDebuggerPresent检测的插件,那么是如何使用IsDebuggerPresent来检测OD的呢?如果我们按F9键让程序运行起来,我们会发现并没有弹出CrackMe窗口,程序直接终止了。
OD的左下方显示程序已经终止,所以,我们看不到窗口出现,嘿嘿。
该CrackMe可能使用的是最常见的API函数IsDebuggerPresent 来检测是否被调试的。
重启该CrackMe,通过单击鼠标右键选择Search for-Name(label) in current module查看API函数列表,看看是否使用了IsDebuggerPresent。
我们看看API函数列表使用了IsDebuggerPresent,嘿嘿。
我们对该函数设置一个断点,看看该CrackMe哪里使用了这个函数。
我们运行起来,马上就断在该函数的入口处了。
根据堆栈窗口中的信息来看,该API函数没有参数,它干的唯一的事情就是检测当前程序是否正在被调试,如果你对该函数还有什么疑问,可以查看MSDN。
这里解释了该函数的功能,我们来翻译一下。
IsDebuggerPresent表示在被调试器调试情况下,调用该函数会返回正在被调试。
并且该函数是被Kernel32.dll导出的,该函数没有参数,如果当前程序正在被调试的话,返回值为1,没有被调试的话,返回值为0。
《计算机组成原理》实验1寄存器试验,2运算器试验
![《计算机组成原理》实验1寄存器试验,2运算器试验](https://img.taocdn.com/s3/m/46de6f5c336c1eb91a375dce.png)
实验指导书课程:计算机组成原理实验教师:班级:第一章系统概述1.1 实验系统组成第二章基础模块实验实验一寄存器实验实验目的:熟悉试验仪各部分功能。
掌握寄存器结构、工作原理及其控制方法。
实验内容:利用实验仪开关区上的开关sk23-sk16提供数据,其它开关做为控制信号,将数据通过DBUS写入OUT 寄存器,并将OUT寄存器的内容送往扩展区通过数码管和发光二极管显示。
实验原理:实验箱用74HC273 来构成寄存器。
(1)74HC273的功能如下:(2)实验箱中74HC273的连接方式:(3)实验逻辑框图12、打开实验仪电源,按CON单元的nRST按键,系统复位;如果EXEC键上方指示灯不亮,请按一次EXEC键,点亮指示灯,表示实验仪在运行状态。
3、利用开关和控制信号将数据通过DBUS写入OUT寄存器,并将OUT寄存器的内容送往扩展区通过数码管和发光二极管显示。
并写出将数据5FH写入OUT寄存器的操作过程。
实验二运算器实验实验目的:了解运算器的组成结构;掌握运算器的工作原理和控制方法。
实验内容:利用实验仪提供的运算器,通过开关提供数据信号,将数据写入寄存器A和寄存器B,并用开关控制ALU的运算方式,验证运算器的功能。
实验原理:(1)实验逻辑框图:信号说明:IN0~IN7:ALU数据输入信号ALU_D0~ALU_D7:ALU数据输出信号:寄存器A写信号,低电平有效。
当T1节拍信号到来,该信号有效时,IN0~IN7数据可以写入寄存器A。
:寄存器B写信号,低电平有效。
当T2节拍信号到来,该信号有效时,IN0~IN7数据可以写入寄存器B。
:ALU计算结果读出信号,当T3节拍信号到来,该信号有效时,ALU计算结果送往ALU_D0~ALU_D7。
S3~S0,CN_I:ALU运算控制信号,控制ALU的运算方法。
T1,T2,T3:三个节拍信号,高电平有效,由con区的uSTEP按键控制,在运行状态时,依次按下uSTEP 键会依次发出T1、T2、T3节拍。
简单解释Windows如何使用FS段寄存器
![简单解释Windows如何使用FS段寄存器](https://img.taocdn.com/s3/m/2d05a73b2af90242a895e527.png)
确实通过读取FS寄存器指定的内存可以获得很多系统关键信息,主要是和进线程相关的很多信息,例如代码:lkd> u PsGetCurrentProcessnt!IoGetCurrentProcess:804f0700 64a124010000 mov eax,dword ptr fs:[00000124h]804f0706 8b4044 mov eax,dword ptr [eax+44h]代码:lkd> u PsGetCurrentThreadnt!PsGetCurrentThread:8052c42a 64a124010000 mov eax,dword ptr fs:[00000124h]可见,fs:[00000124h] 这里存放的是当前线程的KTHREAD,有了这个结构那么当前运行的进程,线程信息就都可以取到了。
by the way,这种运行状态相关的信息必然也只能通过最简单的方式获取到,因为这是获取其它信息的源头。
linux kernel 通过esp 向下取整到8K 就可以得到 thread_info信息,同样的简单。
那么FS作为段寄存器到底指向的是什么呢?我取了内核态和用户态FS的值,在内核态FS=0x30, 在用户态FS=0x3B。
实际上如果你去看wrk中SwapContext 和 KiSystemServices 的代码就会发现,FS 只会是前面提到的两个固定值。
OK,且看内核态FS 指向哪里:代码:kd> r gdtrgdtr=8003f000kd> dq 8003f0008003f000 00000000`00000000 00cf9a00`0000ffff8003f010 00cf9200`0000ffff 00cffa00`0000ffff8003f020 00cff200`0000ffff 80008b04`200020ab8003f030 ffc092df`f0000001 0040f300`00000fff8003f040 0000f200`0400ffff 00000000`000000008003f050 80008954`a3000068 80008954`a36800688003f060 00009202`2f30ffff 0000920b`80003fff8003f070 ff0092ff`700003ff 80009a40`0000ffff我打印了全局描述符GDTR指向的内存内容,FS 指向的描述符应该是其中一项(理论上也有可能指向LDTR,但后面会看到FS没有指向这里)。
fs-jtag仿真器介绍
![fs-jtag仿真器介绍](https://img.taocdn.com/s3/m/1bdce518a7c30c22590102020740be1e650ecc89.png)
第5章 ARM开发及环境搭建学习ARM汇编的第一件事就是搭建编程环境,如今有非常多的IDE及调试软件/仿真硬件,因此这里笔者将提供一些方案给予学习者。
大家知道,ARM公司在前一个开发环境ADS5.2(不再提供升级)后,推出了Realview系列开发环境。
其中Realview MDK环境以其优越的性价比得到了快速的推广。
但本书以GNU-ARM汇编风格作为基础,所以会主要介绍在GNU-ARM 下如何编写ARM汇编程序并进行调试。
本章主要介绍它的使用、配置方法,内容主要有:仿真器简介。
主流编程环境介绍(Eclipse,MDK)。
FS-JTAG的使用方法。
5.1 仿真器简介5.1.1 FS-JTAG仿真器介绍了解行业和相关技术的人都知道,功能完善的ARM仿真器和软件调试环境对于学习ARM 处理器的工作原理和核心知识来说至关重要。
由于之前多年的技术发展和行业实践,针对Cortex-Mx、ARM7、ARM9及ARM11系列处理器,市场上都已经有很多成熟的、价廉物美的仿真器可供选择。
而对于目前最新流行的ARM应用处理器Cortex-A8系列来说,业内的技术工程师们却很难找到价格合适、功能完善的仿真器。
国外动辄几千甚至上万美元的价格,无疑阻碍了广大学习者的积极性,为此,华清远见研发中心为了推进Cortex-A8 ARM处理器的教学,提高合作企业及合作院校广大技术爱好者和培训学员的学习效率,最新生产研发出FS-JTAG仿真器,该款仿真器可以仿真Cortex-M3、ARM7、ARM9、ARM11、Cortex-A8等多个ARM处理器系列。
如果需要专业一些的调试,则应该选择ULINK、TRACE 32这类专业级的仿真器,操作简单,调试功能强大,但价格昂贵。
下面逐一介绍一些常用的仿真器:(1)FS-JTAG仿真器(如图5-1所示)是一款基于开源的OpenOcd接口的仿真器,外观和JLINK相同,有着很全的调试功能,再加上Eclipse这样强大的集成开发环境,使得它同样能成为工程师的首选,它有着如下的硬件特点。
fs[2c]指令
![fs[2c]指令](https://img.taocdn.com/s3/m/5a1980745b8102d276a20029bd64783e09127d97.png)
fs[2c]指令
fs[2c]指令通常是指fs寄存器的第2c个元素,它的具体含义会根据使用的编程语言和环境而有所不同。
在某些情况下,fs[2c]可能代表一个内存地址或一个数据项,用于访问或操作存储在内存中的数据。
在某些编程语言中,fs[2c]可能是一个指令,用于读取或写入内存中的特定位置。
该指令的执行可能需要涉及到其他寄存器或内存位置,以确定要访问的具体内存地址或数据。
如果你想要了解fs[2c]指令在特定编程语言或环境中的具体含义和用法,建议查阅相关的文档或参考资料,以获得更详细的信息。
arch_prctl函数
![arch_prctl函数](https://img.taocdn.com/s3/m/a06333272379168884868762caaedd3383c4b5a8.png)
arch_prctl函数arch_prctl函数是Linux操作系统中的一个系统调用函数,用于设置和获取进程的架构特定控制寄存器的值。
该函数可以通过修改寄存器的值来控制进程的行为和特性。
本文将详细介绍arch_prctl函数的使用方法和功能。
arch_prctl函数的原型如下:```cint arch_prctl(int code, unsigned long *addr);```其中,code参数指定了要执行的操作,而addr参数则是一个指向存储返回结果的缓冲区的指针。
arch_prctl函数支持的code操作有多种,常用的有以下几种:1. ARCH_SET_GS:该操作用于设置进程的GS寄存器的值。
GS寄存器是x86架构中的一个控制寄存器,用于存储进程的全局变量指针。
通过设置GS寄存器的值,可以实现线程本地存储(TLS)的功能。
2. ARCH_SET_FS:该操作用于设置进程的FS寄存器的值。
FS寄存器也是x86架构中的一个控制寄存器,用于存储进程的线程信息块指针。
通过设置FS寄存器的值,可以实现线程局部存储(TLS)的功能。
3. ARCH_GET_FS:该操作用于获取进程的FS寄存器的值。
4. ARCH_GET_GS:该操作用于获取进程的GS寄存器的值。
下面我们分别介绍这些操作的使用方法和功能。
首先是ARCH_SET_GS操作。
可以使用如下代码将进程的GS寄存器的值设置为指定的地址:```cunsigned long addr = 0x12345678;arch_prctl(ARCH_SET_GS, &addr);```通过这样的设置,进程在执行后续操作时,GS寄存器的值将被修改为指定的地址。
接下来是ARCH_SET_FS操作。
可以使用如下代码将进程的FS寄存器的值设置为指定的地址:```cunsigned long addr = 0x87654321;arch_prctl(ARCH_SET_FS, &addr);```通过这样的设置,进程在执行后续操作时,FS寄存器的值将被修改为指定的地址。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
常用的寄存器FS段寄存器因为Win32中的地址为平坦模式,ds,ss,cs等各段的段基地址都指向同一个地方,所以平常用的逻辑地址都是默认以这些段为基址的,不管是数据段还是代码段,只要他们的偏移相等,那么他们就是寻址一样的物理内存,所以我们就只需指明偏移就能得到统一的寻址目标,不管这个目标是在代码段还是数据段或者堆栈段之中。
WriteProcessMemory用的就是这样的“逻辑地址”,像"0xXXXXXXXX",其实,这样的逻辑地址实际上是这样的形式:ds:XXXXXXXXX,只因为ds=ss=cs,所以可以用ds:XXXXXXXXX来寻址cs:XXXXXXXX或者ss:XXXXXXXX,也就是只需要指定偏移就足够寻址代码段或者数据段了。
但是在win32中,fs却和各个段寄存器的值不一样,所以要想用ds来寻址fs指向的内存,那就得转换偏移了,因为fs:XXXXXXXX和ds:XXXXXXXX指的并不是同样的内存;而如果用WriteProcessMemory寻址某个地址如 0xXXXXXXXX的话,它默认的寻址却是ds:XXXXXXXX。
一个程序本质上都是由 bss段、data段、text段三个组成的。
这样的概念,不知道最初来源于哪里的规定,但在当前的计算机程序设计中是很重要的一个基本概念。
而且在嵌入式系统的设计中也非常重要,牵涉到嵌入式系统运行时的内存大小分配,存储单元占用空间大小的问题。
在采用段式内存管理的架构中(比如intel的80x86系统),bss段(Block Started by Symbol segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域,一般在初始化时bss 段部分将会清零。
bss段属于静态内存分配,即程序一开始就将其清零了。
在C语言之类的程序编译完成之后,已初始化的全局变量保存在.data 段中,未初始化的全局变量保存在.bss 段中。
在《Programming ground up》里对.bss的解释为:There is another section called the .bss. This section is like the data section, except that it doesn’t take up space in the executable.text和data段都在可执行文件中(在嵌入式系统里一般是固化在镜像文件中),由系统从可执行文件中加载;而bss段不在可执行文件中,由系统初始化。
寄存器一般分为以下几类4个数据寄存器(EAX、EBX、ECX和EDX)2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)6个段寄存器(ES、CS、SS、DS、FS和GS)1个指令指针寄存器(EIP) 1个标志寄存器(EFlags)①数据寄存器AX称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。
累加器可用于乘、除、输入/输出等操作,它们的使用频率很高;BX称为基地址寄存器(Base Register)。
它可作为存储器指针来使用;CX称为计数寄存器(Count Register)。
在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数;DX称为数据寄存器(Data Register)。
在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。
在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址,但在32位CPU中,其32位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据保存算术逻辑运算结果,而且也可作为指针寄存器,所以,这些32位寄存器更具有通用性。
②变址和指针寄存器(ESI和EDI)寄存器ESI、EDI、SI和DI统称为变址寄存器(Index Register),主要用于存放存储单元在段内的偏移量,通过它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。
作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。
它们可作一般的存储器指针使用。
在字符串操作指令的执行过程中,对它们有特定的要求,且具有特殊的功能③指针寄存器(ESP和EBP)32位CPU有2个32位通用寄存器EBP和ESP。
其低16位对应先前CPU中的BP 和SP,低16位数据的存取不影响高16位的数据。
寄存器EBP、ESP、BP和SP称为指针寄存器(Pointer Register),主要用于存放堆栈内存储单元的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。
作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。
它们主要用于访问堆栈内的存储单元,并且规定:BP为基指针(Base Pointer)寄存器,用它可直接存取堆栈中的数据;SP为堆栈指针(Stack Pointer)寄存器,用它只可访问栈顶。
④段寄存器(ES、CS、SS、DS、FS和GS)CS——代码段寄存器(Code Segment Register),其值为代码段的段值;DS——数据段寄存器(Data Segment Register),其值为数据段的段值;SS——堆栈段寄存器(Stack Segment Register),其值为堆栈段的段值;ES——附加段寄存器(Extra Segment Register),其值为附加数据段的段值;FS——附加段寄存器(Extra Segment Register),其值为附加数据段的段值;GS——附加段寄存器(Extra Segment Register),其值为附加数据段的段值。
在16位CPU系统中,它只有4个段寄存器.在32位微机系统中,它有6个段寄存器.32位CPU有两个不同的工作方式:实模式和保护模式。
在每种方式下,段寄存器的作用是不同的。
有关规定简单描述如下:实模式:前4个段寄存器CS、DS、ES和SS与先前CPU中的所对应的段寄存器的含义完全一致,内存单元的逻辑地址仍为“段值:偏移量”的形式。
为访问某内存段内的数据,必须使用该段寄存器和存储单元的偏移量。
保护模式:在此方式下,情况要复杂得多,装入段寄存器的不再是段值,而是称为“选择子”(Selector)的某个值。
注:这里特别提供FS寄存器的偏移说明FS寄存器指向当前活动线程的TEB结构(线程结构)偏移说明000 指向SEH链指针004 线程堆栈顶部008 线程堆栈底部00C SubSystemTib010 FiberData014 ArbitraryUserPointer018 FS段寄存器在内存中的镜像地址020 进程PID024 线程ID02C 指向线程局部存储指针030 PEB结构地址(进程结构)034 上个错误号举例:POP DWORD PTR FS:[004]这个句指令的意思就是将堆栈顶部的4个字节的字符弹栈出去!⑤指令指针寄存器(EIP)32位CPU把指令指针扩展到32位,并记作EIP,EIP的低16位与先前CPU中的IP作用相同。
指令指针EIP、IP(Instruction Pointer)是存放下次将要执行的指令在代码段的偏移量。
在具有预取指令功能的系统中,下次要执行的指令通常已被预取到指令队列中,除非发生转移情况。
所以,在理解它们的功能时,不考虑存在指令队列的情况。
在实模式下,由于每个段的最大范围为64K,所以,EIP中的高16位肯定都为0,此时,相当于只用其低16位的IP来反映程序中指令的执行次序。
6、标志寄存器一、运算结果标志位1、进位标志CF(Carry Flag)进位标志CF主要用来反映运算是否产生进位或借位。
如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。
使用该标志位的情况有:多字(字节)数的加减运算,无符号数的大小比较运算,移位操作,字(字节)之间移位,专门改变CF值的指令等。
2、奇偶标志PF(Parity Flag)奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。
如果“1”的个数为偶数,则PF的值为1,否则其值为0。
利用PF可进行奇偶校验检查,或产生奇偶校验位。
在数据传送过程中,为了提供传送的可靠性,如果采用奇偶校验的方法,就可使用该标志位。
3、辅助进位标志AF(Auxiliary Carry Flag)在发生下列情况时,辅助进位标志AF的值被置为1,否则其值为0:(1)、在字操作时,发生低字节向高字节进位或借位时;(2)、在字节操作时,发生低4位向高4位进位或借位时。
对以上6个运算结果标志位,在一般编程情况下,标志位CF、ZF、SF和OF的使用频率较高,而标志位PF和AF的使用频率较低。
4、零标志ZF(Zero Flag)零标志ZF用来反映运算结果是否为0。
如果运算结果为0,则其值为1,否则其值为0。
在判断运算结果是否为0时,可使用此标志位。
5、符号标志SF(Sign Flag)符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。
在微机系统中,有符号数采用补码表示法,所以,SF也就反映运算结果的正负号。
运算结果为正数时,SF的值为0,否则其值为1。
6、溢出标志OF(Overflow Flag)溢出标志OF用于反映有符号数加减运算所得结果是否溢出。
如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被清为0。
“溢出”和“进位”是两个不同含义的概念,不要混淆。
如果不太清楚的话,请查阅《计算机组成原理》课程中的有关章节。
二、状态控制标志位状态控制标志位是用来控制CPU操作的,它们要通过专门的指令才能使之发生改变。
1、追踪标志TF(Trap Flag)当追踪标志TF被置为1时,CPU进入单步执行方式,即每执行一条指令,产生一个单步中断请求。
这种方式主要用于程序的调试。
指令系统中没有专门的指令来改变标志位TF的值,但程序员可用其它办法来改变其值。
2、中断允许标志IF(Interrupt-enable Flag)中断允许标志IF是用来决定CPU是否响应CPU外部的可屏蔽中断发出的中断请求。
但不管该标志为何值,CPU都必须响应CPU外部的不可屏蔽中断所发出的中断请求,以及CPU内部产生的中断请求。
具体规定如下:(1)、当IF=1时,CPU可以响应CPU外部的可屏蔽中断发出的中断请求;(2)、当IF=0时,CPU不响应CPU外部的可屏蔽中断发出的中断请求。
CPU的指令系统中也有专门的指令来改变标志位IF的值。
3、方向标志DF(Direction Flag)方向标志DF用来决定在串操作指令执行时有关指针寄存器发生调整的方向。
具体规定在第5.2.11节——字符串操作指令——中给出。