gnu linux assembly language l.
Download
Skip this Video
Loading SlideShow in 5 Seconds..
GNU/Linux assembly language PowerPoint Presentation
Download Presentation
GNU/Linux assembly language

Loading in 2 Seconds...

play fullscreen
1 / 24

GNU/Linux assembly language - PowerPoint PPT Presentation


  • 173 Views
  • Uploaded on

GNU/Linux assembly language. Reviewing the basics of assembly language programming for Intel x86-based Linux systems. Our motivations. We want to study the new Intel processor technologies for Core-2 Duo & Pentium-D: EM64T (Extended Memory 64-bit technology) VT (Virtualization Technology)

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about 'GNU/Linux assembly language' - juliet


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
gnu linux assembly language

GNU/Linux assembly language

Reviewing the basics of assembly language programming for Intel x86-based Linux systems

our motivations
Our motivations
  • We want to study the new Intel processor technologies for Core-2 Duo & Pentium-D:
    • EM64T (Extended Memory 64-bit technology)
    • VT (Virtualization Technology)
  • These capabilities are optionally ‘enabled’ during the system’s ‘startup’ phase, so we will want to execute our own ‘boot loader’ code to have control at the earliest stage
boot code
‘boot’ code
  • On PC systems the mechanism for doing the IPL (‘Initial Program Load’) requires a ‘boot-loader’ program that can fit within a single 512-byte disk-sector
  • High-level programming languages (such C/C++) typically employ compilers which generate object-code files whose size is too large to be stored in a disk-sector
portability implications
Portability implications
  • Also ‘High-Level’ languages typically have platform ‘portability’ as a key design-goal, but they can’t achieve that requirement if architecture-specific language-constructs are employed; thus they usually offer to a systems programmer only those features in the ‘lowest common denominator’ of the various different computer-systems
intel s vmx instructions
Intel’s VMX instructions
  • So when we want to explore Intel’s VM-x technology (Virtualization for x86 CPUs), we will need to use ‘low-level’ computer language (i.e., assembly language)
  • The advantage, of course, is that we will thereby acquire total control over the CPU in any Intel-based computer that supports the new so-called VMX instruction-set.
slide6

Simplified Block Diagram

Central

Processing

Unit

Main

Memory

system bus

I/O

device

I/O

device

I/O

device

I/O

device

slide7

The sixteen x86 registers

EAX

ESP

EBX

EBP

ECX

ESI

EDX

EDI

CS

DS

ES

FS

GS

SS

EIP

EFLAGS

Intel Pentium processor

the x86 eflags register
The x86 EFLAGS register

31 22 21 20 19 18 17 16 15 14 13-12 11 10 9 8 7 6 5 4 3 2 1 0

0000000000

I

D

V

I

P

V

I

F

A

C

V

M

R

F

0

N

T

IOPL

O

F

D

F

I

F

T

F

S

F

Z

F

0

A

F

0

P

F

1

C

F

Legend: ZF = Zero Flag

SF = Sign Flag

IOPL = I/O Privilege-Level (0,1,2,3) CF = Carry Flag

AC = Alignment-Check (1=yes, 0=no) PF = Parity Flag

NT = Nested-Task (1=yes, 0=no) OF = Overflow Flag

RF = Resume Flag (1=yes, 0=no) AF = Auxiliary Flag

VM = Virtual-8086 Mode (1=yes, 0=no)

VIF = ‘Virtual’ Interrupt-Flag VIP = ‘Virtual’ Interrupt is Pending

ID = the CPUID-instruction is implemented if this bit can be ‘toggled’

= ‘reserved’ bit

= ‘status’ flag (for application programming)

our eflags s demo
Our ‘eflags.s’ demo
  • This program shows the EFLAGS bits at the moment the program began executing
  • It’s instructive to run this program before you execute our ‘iopl3’ command, and do so again after you execute that command
slide10

program translation steps

eflags.s

eflags.o

program

source

module

eflags

program

object

module

assembly

linking

the

executable

program

object module library

object module library

other object modules

Not every program requires

additional object-modules

program translation commands
program translation commands
  • To ‘assemble’ your source-file:
  • To ‘link’ the resulting object-file:
  • To ‘run’ your executable program:

$ as eflags.s –o eflags.o

$ ld eflags.o –o eflags

$ ./eflags

slide12

Last night (Wed, 24 Jan 2007) Alex Fedosov wrote:

>

> Subject: Re: hardware

>

> I checked #11-#12 serial cable and it seems that it was

> loose. Let me know if it continues to be a problem.

>

> Good news! Your machines are here! We will be building

> them tomorrow.

>

> -a

our feedback s demo
Our ‘feedback.s’ demo
  • We wrote an example-program that shows how you could program the serial UART in the GNU/Linux assembly language
  • It uses the x86 ‘in’ and ‘out’ instructions to access the UART’s i/o-ports:
    • 0x03F8: port-address for Divisor-Latch
    • 0x03FB: port-address for Line-Control
    • 0x03FD: port-address for Line-Status
    • 0x03F8: port-address for RxD and TxD
slide14

Statement layout

Parsing an assembly language statement

  • A colon character (‘:’) terminates the label
  • A white-space character (e.g., blank or tab) separates the opcode from its operand(s)
  • A hash character (‘#’) begins the comment

label: opcode operand(s) # comment

how outb works
How ‘outb’ works
  • Three-steps to perform ‘outb( data, port );’
    • Step 1: put port-address into DX register
    • Step 2: put data-value into AL register
    • Step 3: output data-value to port-address

mov $0x03FB, %dx # UART’s Line_Control register

mov $0x80, %al # value for setting the DLAB bit

out %al, %dx # output data-byte to the i/o-port

how in works
How ‘in’ works
  • Three steps to perform ‘data = in( port );’
    • Step 1: put port-address into DX register
    • Step 2: input from port-address to AL register
    • Step 3: assign value in AL to location ‘data’

mov $0x03FD, %dx # UART’s Line_Status register

in %dx, %al # input from i/o-port to accumulator

mov %al, data # copy accumulator-value to variable

slide17

How to receive a byte

Read the Line Status Register

Received Data

is Ready?

NO

YES

Read byte from the Receiver Data Register

DONE

rx implementation
Rx implementation

# This assembly language code-fragment inputs a byte of data from

# the remote PC, then assigns it to a memory-location labeled ‘inch’

mov $0x03FD, %dx # UART’s Line_Status register

spin1: in %dx, %al # input the current line-status

test $0x01, %al # is the RDR-bit zero?

jz spin1 # yes, no new data received

mov $0x03F8, %dx # UART’s RxData register

in %dx, %al # input the new data-byte

mov %al, inch # store the data into ‘inch’

slide19

How to transmit a byte

Read the Line Status Register

Transmit Holding Register

is Empty?

NO

YES

Write byte to the Transmitter Data Register

DONE

tx implementation
Tx implementation

# This assembly language code-fragment fetches a byte of data from

# a memory-location labeled ‘outch’, then outputs it to the remote PC

mov $0x03FD, %dx # UART’s Line_Status register

spin2: in %dx, %al # input the current line-status

test $0x20, %al # is the THRE-bit zero?

jz spin2 # yes, transmitter is still busy

mov $0x03F8, %dx # UART’s TxData register

mov outch, %al # get the value to transmit

out %al, %dx # output byte to TxD register

slide21

Initializing the UART

BEGIN

Set the Divisor Latch Access Bit

in the Line Control Register

Write a nonzero value to the Divisor Latch Register

Clear the Divisor Latch Access Bit

and specify the desired data-format

in the Line Control Register

DONE

init uart implementation
Init-UART implementation

# This assembly language code-fragment initializes the UART for

# ‘polled-mode’ operation at 115200 baud and 8-N-1 data-format

mov $0x03FB, %dx # UART Line_Control register

mov $0x80, %al # set the DLAB-bit (bit 7) to 1

out %al, %dx # for access to Divisor_Latch

mov $0x03F8, %dx # UART Divisor_Latch register

mov $0x0001, %ax # use 1 as the divisor-value

out %ax, %dx # output the 16-bit latch-value

mov $0x03FB, %dx # UART Line_Control register

mov $0x03, %al # set data-format to 8-N-1

out %al, %dx # establish UART data-format

in class exercises
In-class exercises
  • You can try assembling, linking, and then running our ‘feedback.s’ demo-program (use the ‘trycable’ program to send some characters via the ‘null-modem’ cable)
  • Can you modify this ‘feedback.s’ program so that it will continuously display and transmit every character it receives?
exercise illustration
Exercise illustration

null-modem cable

Start our ‘feedback’ program

running on this workstation

Then run our ‘trycable’ program

on this other workstation

Now watch what happened on these two screens