Hexadecimal Notation Using sixteen as a number base when representing binary data
Positional Notation (Base 16) Set of sixteen digit-symbols: 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F Position-values are powers of sixteen: 16 0 = 1, 16 1 = 16, 16 2 = 256, 16 3 = 4096, … Write 32-bit addresses using 8 hex digits Example: This 32-bit binary number is written more briefly as: C (hex)
‘nybbles’ Each hex digit represents 4-bits: 0 = = = = = 0010A = = 0011B = = 0100C = = 0101D = = 0110E = = 0111F = 1111
Conversions Register AL holds 8 binary digits (bits) Example:AL = (binary) One byte (8-bits) equals two nybbles: AL = Each nybble (4-bits) is just one hex digit: Example:AL = 61 (hex)
Interpreting numbers Our assembler understands hex notation Assembler also recognizes ‘octal’ (base 8) Notations conform to C language syntax Numbers are assumed decimal (base 10) unless otherwise indicated (via a ‘prefix’) Example:50 means ‘fifty’ (base 10) but 0x50 means ‘eighty’ (base 16) and 050 means ‘forty’ (base 8)
ASCII-codes in hex Uppercase letter ‘A’ is ascii-code 65 Very often it’s written (in hex) as 0x41 Lowercase letter ‘a’ is ascii-code 97 And very often is written (in hex) as 0x61 Hex makes it easy to ‘see’ the binary data Examples: 0x41 represents and0x61 represents This suggest a way to do ascii conversions
Lowercase vs. Uppercase Ascii-codes for lowercase letters (‘a’-’z’): 0x61, 0x62, 0x63, …, 0x79, 0x7A Ascii-codes for uppercase letters (‘A’-’Z’): 0x41, 0x42, 0x43, …, 0x59, 0x5A We can visualize these values as ‘bits’ – lowercase: , …, – uppercase: , …, We see bit number 5 is where they differ!
Using ‘AND’ and ‘OR’ We can use the ‘bitwise-OR’ operator to convert uppercase to lowercase: i.e., lowercase = uppercase | 0x20; We can use the ‘bitwise-AND’ operator to convert lowercase to uppercase: i.e.,uppercase = lowercase & 0xDF;
The ‘toupper.s’ program We can write an assembly language loop to convert a user’s input into uppercase Select a 32-bit register to use as a ‘pointer’ Example: movl$buffer, %ebx In case EBX points to a lowercase letter, we can convert it to uppercase by using: andb$0xDF, (%ebx) # resets bit 5 to 0 The ‘b’ suffix here tells the operand’s size
The program’s loop movl$buffer, %ebx movlnbytes, %ecx again:cmpb$’a’, (%ebx) jbnochg cmpb$’z’, (%ebx) janochg andb$0xDF, (%ebx) nochg:incl%ebx loopagain
The ‘password’ program main obtain_passwordnotify_the_usergrant_or_refuseverify_validity request_inputreceive_reply
Enhanced ‘password’ main obtain_passwordnotify_the_usergrant_or_refuseverify_validity request_inputreceive_reply use_uppercase
Typical kinds of loops ‘while’ loops: So long as a condition is true perform the action in the body of this loop ‘until’ loops: Perform the action in the body of this loop until condition is no longer true Note: a while-loop can be empty, but an until-loop always executes at least once
Flowcharts condition action TRUE leave FALSE TRUE FALSE leave WHILE-LOOP UNTIL-LOOP initializations enter
A typical ‘WHILE’ loop movb$FALSE, done again: cmpb$FALSE, done jnefinis # the body of the loop goes here # (and may alter the ‘done’ flag) jmpagain finis:
A typical ‘UNTIL’ loop movb$TRUE, done again: # the body of the loop goes here # (and may alter the ‘done’ flag) cmpb$TRUE, done jeagain
‘Counted’ loops Very often we know in advance the number of times that the body of a loop needs to execute In these cases the loop’s exit-condition is based on the changing value of a counter Sometimes a counted loop needs to allow for an early exit (before the final count is reached) Pentium has some special support-instructions: loop andjecxz Also (for early exits): loope/loopz and loopne/loopnz
A typical ‘counted’ loop movl$array, %ebx movl$0, %eax movl$50, %ecx nxadd:addl(%ebx), %eax addl$4, %ebx loopnxadd movl%eax, total
Might your count be zero? movlnbytes, %ecx jecxzfinis again: # the body of your loop goes here loopagain finis:
An ‘early exit’ example # gets the first non-blank character from ‘inbuf’ # (where ‘nbytes’ is length of the ‘inbuf’ array) movl$inbuf, %esi movlnbytes, %ecx again:movb(%esi), %al incl%esi cmpb$’ ’, %al loopeagain