펌웨어(Firmware)대부분의 컴퓨터 주변기기에는 하드웨어와 소프트웨어 사이를 궁합이 잘 맞도록 조정해주는 부분이 있는데 그것은 소프트웨어를 하드웨어화 시킨 것으로서 소프트웨어와 하드웨어의 중간에 해당하는 것을 말한다. 보통 이를 펌웨어(Firmware)라고 하는데, 이것은 시스템의 효율을 올리기 위해 롬(ROM)에 들어 있는 기본적인 일종의 프로그램이다. 다만 지워지거나 변경하기 힘들도록 제작 당시부터 하드웨어에 포함되어 만들어지기 때문에 프로그램도 기기도 아닌 펌웨어라고 부른다. 펌웨어는 하드웨어 내부에 설치되어 기기 운용에 필수적인 정보를 담고 있거나 기본 동작을 수행하는데 필요한 프로그램을 처리한다. 펌웨어를 쉽게 이해하려면 메인보드나 그래픽카드, 모뎀의 롬 바이오스를 떠올리면 된다. 마이크로 프로그램의 집단으로 소프트웨어의 특성을 지니는 롬에 고정되어 있기 때문에 하드웨어의 특성도 지니고 있다. 또한 펌웨어는 속도가 빠른 제어 기억장치에 있는 마이크로 명령문으로 이루어져 있다.소프트웨어의 기능을 펌웨어로 바꾸면 바꾸기 어렵다는 단점이 있으나 속도가 빨라지기 때문에 고속처리가 필요한 프로그램은 펌웨어로 대체되고 있다. 시스템의 효율을 올리기 위해 롬에 들어 있는 기본적인 프로그램이다. 전형적인 처리 루틴, 고속 처리, 비휘발성, 변경불가 등이 특징이다. 보통 펌웨어를 IBM에서는 마이크로 코드(micro code)라고 부른다.펌웨어는 예전에는 어셈블리 코드로 작성했다. 하지만 마이크로 명령문이 어셈블리어 명령문을 대신하면서 오늘날 컴퓨터 구조에 있어 중요한 영향을 미쳤으며 특히 운영체제의 효율과 보안에 중요한 영향을 미치게 되었다.이러한 마이크로 코드에는 수직 마이크로 코드와 수평 마이크로 코드가 있다. 수직 마이크로 코드는 기계어 명령문을 실행하는 것과 아주 비슷하여 전형적인 한 개의 수직 마이크로 코드로 빠른 속도로 적은 량의 데이터를 처리한다. 이러한 예로 레지스터간의 데이터 이동을 들 수 있다. 수평 마이크로 코드는 수직 마이크로 코드보다 조금 더 많은 비트를 필요로 한다. 이것은 더 많은 데이터를 이동하게 설계되어있기 때문이다. 수평 마이크로 코드가 수직 마이크로 코드보다 좀더 많은 일을 할 수는 있지만 설계가 더 힘들고 에러 찾기가 어렵다는 단점이 있다.또한 컴퓨터 시스템의 많은 기능을 모두 이 마이크로 코드화하는 것보다는 자주 실행되는 명령문들을 소프트웨어 대신 펌웨어화 하면 효율성의 엄청난 증가를 가져온다. 그렇기 때문에 어떠한 기능들을 마이크로화 시킬 것인지를 잘 생각하여야 한다.그럼 마이크로 코드를 사용한 마이크로 프로그래밍은 어디에 사용될 것인가. 우선 에뮬레이션에 사용되고 있다. 에뮬레이션은 어떤 컴퓨터가 마치 다른 컴퓨터처럼 기능을 갖게 할 수 있게 하는 기술을 말한다. 에뮬레이트 될 컴퓨터의 기계어가 새 컴퓨터에 마이크로 프로그램화되어 있어야 그전에 컴퓨터의 기계어가 바로 새 컴퓨터에서 실행될 수 있게 된다. 컴퓨터 회사에서는 계속해서 컴퓨터를 생산할 때 이런 기법을 사용하는데 이렇게 해야만 전 컴퓨터 사용자가 컴퓨터를 전과 같이 사용할 수 있다.다음으로 마이크로 다이아그노스틱스(Micro diagnostics)가 있다. 기계어로 된 프로그램이 하드웨어를 엑세스하는 것보다 마이크로 프로그램이 더 많은 하드웨어를 엑세스할 수 있다. 그래서 에러발견 및 수정을 보다 폭넓게 또 보다 나은 방법으로 할 수 있다. 어떤 컴퓨터는 마이크로 다아아그노스틱스를 추가하여 찾기 어려운 에러를 찾기도 하며 오퍼레이션 수행을 융통성 있게 하고 있다.개인용 변형 컴퓨터(Personalized Computer)는 개인용 컴퓨터를 사용하는 사용자가 자신의 필요에 맞게 컴퓨터를 변형하여 사용하는 것이다. 일반적인 컴퓨터 생산 회사에서는 범용 컴퓨터 생산에 주력하여 대량생산에 주목적을 두고 있다. 그렇기에 특수목적을 위한 컴퓨터는 꺼려하게 된다. 그래서 컴퓨터 사용자들은 자신에게 맞게 변형을 하여야 한다. 이러한 작업을 소프트웨어에서 실행하게 된다. 하드웨어는 일반 소프트웨어를 실행시키는 기본적 장비를 갖추는 것이고 여기에 사용자들은 회사에서 제공하는 마이크로 코드나 자신이 직접 작성한 마이크로 코드를 사용 가능하게 하는 것이다.