1                                  ; shift_64.asm    the nasm code is one sample, not unique
     2                                  ;
     3                                  ; compile:	nasm -f elf64 -l shift_64.lst  shift_64.asm
     4                                  ; link:		gcc -o shift_64  shift_64.o
     5                                  ; run:		./shift_64 > shift_64.out
     6                                  ;
     7                                  ; the output from running shift.asm (zero filled) is:	
     8                                  ; shl rax,4, old rax=ABCDEF0987654321, new rax=BCDEF09876543210, 
     9                                  ; shl rax,8, old rax=ABCDEF0987654321, new rax=CDEF098765432100, 
    10                                  ; shr rax,4, old rax=ABCDEF0987654321, new rax= ABCDEF098765432, 
    11                                  ; sal rax,8, old rax=ABCDEF0987654321, new rax=CDEF098765432100, 
    12                                  ; sar rax,4, old rax=ABCDEF0987654321, new rax=FABCDEF098765432, 
    13                                  ; rol rax,4, old rax=ABCDEF0987654321, new rax=BCDEF0987654321A, 
    14                                  ; ror rax,4, old rax=ABCDEF0987654321, new rax=1ABCDEF098765432, 
    15                                  ; shld rdx,rax,8, old rdx:rax=0,ABCDEF0987654321,
    16                                  ;                 new rax=ABCDEF0987654321 rdx=              AB, 
    17                                  ; shl rax,8     , old rdx:rax=0,ABCDEF0987654321,
    18                                  ;                 new rax=CDEF098765432100 rdx=              AB, 
    19                                  ; shrd rdx,rax,8, old rdx:rax=0,ABCDEF0987654321,
    20                                  ;                 new rax=ABCDEF0987654321 rdx=2100000000000000, 
    21                                  ; shr rax,8     , old rdx:rax=0,ABCDEF0987654321,
    22                                  ;                 new rax=  ABCDEF09876543 rdx=2100000000000000, 
    23                                  
    24                                          extern printf		; the C function to be called
    25                                  
    26                                  %macro	prt	1		; old and new rax
    27                                  	section .data
    28                                  .str	db	%1,0		; %1 is which shift string
    29                                  	section .text
    30                                          mov	rdi, fmt	; address of format string
    31                                  	mov	rsi, .str 	; callers string
    32                                  	mov	rdx,rax		; new value
    33                                  	mov	rax, 0		; no floating point
    34                                          call    printf          ; Call C function
    35                                  %endmacro
    36                                  
    37                                  %macro	prt2	1		; old and new rax,rdx
    38                                  	section .data
    39                                  .str	db	%1,0		; %1 is which shift
    40                                  	section .text
    41                                          mov	rdi, fmt2	; address of format string
    42                                  	mov	rsi, .str 	; callers string
    43                                  	mov	rcx, rdx	; new rdx befor next because used
    44                                  	mov	rdx, rax	; new rax
    45                                  	mov	rax, 0		; no floating point
    46                                          call    printf          ; Call C function
    47                                  %endmacro
    48                                  
    49                                  	 section .bss
    50 00000000 <res 00000008>          raxsave: resq	1		; save rax while calling a function 
    51 00000008 <res 00000008>          rdxsave: resq	1		; save rdx while calling a function 
    52                                  	
    53                                  	section .data  		; preset constants, writeable
    54 00000000 2143658709EFCDAB        b64:	dq	0xABCDEF0987654321	; data to shift
    55 00000008 25732C206F6C642072-     fmt:    db "%s, old rax=ABCDEF0987654321, new rax=%16lX, ",10,0	; format string
    56 00000011 61783D414243444546-
    57 0000001A 303938373635343332-
    58 00000023 312C206E6577207261-
    59 0000002C 783D2531366C582C20-
    60 00000035 0A00               
    61 00000037 25732C206F6C642072-     fmt2:   db "%s, old rdx:rax=0,ABCDEF0987654321,",10,"                new rax=%16lX rdx=%16lX, ",10,0
    62 00000040 64783A7261783D302C-
    63 00000049 414243444546303938-
    64 00000052 373635343332312C0A-
    65 0000005B 202020202020202020-
    66 00000064 202020202020206E65-
    67 0000006D 77207261783D253136-
    68 00000076 6C58207264783D2531-
    69 0000007F 366C582C200A00     
    70                                  	
    71                                  	section .text		; instructions, code segment
    72                                  	global	 main		; for gcc standard linking
    73 00000000 55                      main:	push	rbp		; set up stack
    74                                  	
    75 00000001 488B0425[00000000]      shl1:	mov	rax, [b64]	; data to shift
    76 00000009 48C1E004                	shl	rax, 4		; shift rax 4 bits, one hex position left
    77                                  	prt	"shl rax,4 "	; invoke the print macro
    78                              <1>  section .data
    79 00000086 73686C207261782C34- <1> .str db %1,0
    80 0000008F 2000                <1>
    81                              <1>  section .text
    82 0000000D 48BF-               <1>  mov rdi, fmt
    83 0000000F [0800000000000000]  <1>
    84 00000017 48BE-               <1>  mov rsi, .str
    85 00000019 [8600000000000000]  <1>
    86 00000021 4889C2              <1>  mov rdx,rax
    87 00000024 B800000000          <1>  mov rax, 0
    88 00000029 E8(00000000)        <1>  call printf
    89                                  
    90 0000002E 488B0425[00000000]      shl4:	mov	rax, [b64]	; data to shift
    91 00000036 48C1E008                	shl	rax,8		; shift rax 8 bits. two hex positions left
    92                                  	prt	"shl rax,8 "	; invoke the print macro
    93                              <1>  section .data
    94 00000091 73686C207261782C38- <1> .str db %1,0
    95 0000009A 2000                <1>
    96                              <1>  section .text
    97 0000003A 48BF-               <1>  mov rdi, fmt
    98 0000003C [0800000000000000]  <1>
    99 00000044 48BE-               <1>  mov rsi, .str
   100 00000046 [9100000000000000]  <1>
   101 0000004E 4889C2              <1>  mov rdx,rax
   102 00000051 B800000000          <1>  mov rax, 0
   103 00000056 E8(00000000)        <1>  call printf
   104                                  
   105 0000005B 488B0425[00000000]      shr4:	mov	rax, [b64]	; data to shift
   106 00000063 48C1E804                	shr	rax,4		; shift
   107                                  	prt	"shr rax,4 "	; invoke the print macro
   108                              <1>  section .data
   109 0000009C 736872207261782C34- <1> .str db %1,0
   110 000000A5 2000                <1>
   111                              <1>  section .text
   112 00000067 48BF-               <1>  mov rdi, fmt
   113 00000069 [0800000000000000]  <1>
   114 00000071 48BE-               <1>  mov rsi, .str
   115 00000073 [9C00000000000000]  <1>
   116 0000007B 4889C2              <1>  mov rdx,rax
   117 0000007E B800000000          <1>  mov rax, 0
   118 00000083 E8(00000000)        <1>  call printf
   119                                  
   120 00000088 488B0425[00000000]      sal4:	mov	rax, [b64]	; data to shift
   121 00000090 48C1E008                	sal	rax,8		; shift
   122                                  	prt	"sal rax,8 "	; invoke the print macro
   123                              <1>  section .data
   124 000000A7 73616C207261782C38- <1> .str db %1,0
   125 000000B0 2000                <1>
   126                              <1>  section .text
   127 00000094 48BF-               <1>  mov rdi, fmt
   128 00000096 [0800000000000000]  <1>
   129 0000009E 48BE-               <1>  mov rsi, .str
   130 000000A0 [A700000000000000]  <1>
   131 000000A8 4889C2              <1>  mov rdx,rax
   132 000000AB B800000000          <1>  mov rax, 0
   133 000000B0 E8(00000000)        <1>  call printf
   134                                  
   135 000000B5 488B0425[00000000]      sar4:	mov	rax, [b64]	; data to shift
   136 000000BD 48C1F804                	sar	rax,4		; shift
   137                                  	prt	"sar rax,4 "	; invoke the print macro
   138                              <1>  section .data
   139 000000B2 736172207261782C34- <1> .str db %1,0
   140 000000BB 2000                <1>
   141                              <1>  section .text
   142 000000C1 48BF-               <1>  mov rdi, fmt
   143 000000C3 [0800000000000000]  <1>
   144 000000CB 48BE-               <1>  mov rsi, .str
   145 000000CD [B200000000000000]  <1>
   146 000000D5 4889C2              <1>  mov rdx,rax
   147 000000D8 B800000000          <1>  mov rax, 0
   148 000000DD E8(00000000)        <1>  call printf
   149                                  
   150 000000E2 488B0425[00000000]      rol4:	mov	rax, [b64]	; data to shift
   151 000000EA 48C1C004                	rol	rax,4		; shift
   152                                  	prt	"rol rax,4 "	; invoke the print macro
   153                              <1>  section .data
   154 000000BD 726F6C207261782C34- <1> .str db %1,0
   155 000000C6 2000                <1>
   156                              <1>  section .text
   157 000000EE 48BF-               <1>  mov rdi, fmt
   158 000000F0 [0800000000000000]  <1>
   159 000000F8 48BE-               <1>  mov rsi, .str
   160 000000FA [BD00000000000000]  <1>
   161 00000102 4889C2              <1>  mov rdx,rax
   162 00000105 B800000000          <1>  mov rax, 0
   163 0000010A E8(00000000)        <1>  call printf
   164                                  
   165 0000010F 488B0425[00000000]      ror4:	mov	rax, [b64]	; data to shift
   166 00000117 48C1C804                	ror	rax,4		; shift
   167                                  	prt	"ror rax,4 "	; invoke the print macro
   168                              <1>  section .data
   169 000000C8 726F72207261782C34- <1> .str db %1,0
   170 000000D1 2000                <1>
   171                              <1>  section .text
   172 0000011B 48BF-               <1>  mov rdi, fmt
   173 0000011D [0800000000000000]  <1>
   174 00000125 48BE-               <1>  mov rsi, .str
   175 00000127 [C800000000000000]  <1>
   176 0000012F 4889C2              <1>  mov rdx,rax
   177 00000132 B800000000          <1>  mov rax, 0
   178 00000137 E8(00000000)        <1>  call printf
   179                                  
   180 0000013C 488B0425[00000000]      shld4:	mov	rax, [b64]	; data to shift
   181 00000144 BA00000000              	mov	rdx,0		; register receiving bits
   182 00000149 480FA4C208              	shld	rdx,rax,8	; shift
   183 0000014E 48890425[00000000]      	mov	[raxsave],rax	; save, destroyed by function
   184 00000156 48891425[08000000]      	mov	[rdxsave],rdx	; save, destroyed by function
   185                                  	prt2	"shld rdx,rax,8"; invoke the print macro
   186                              <1>  section .data
   187 000000D3 73686C64207264782C- <1> .str db %1,0
   188 000000DC 7261782C3800        <1>
   189                              <1>  section .text
   190 0000015E 48BF-               <1>  mov rdi, fmt2
   191 00000160 [3700000000000000]  <1>
   192 00000168 48BE-               <1>  mov rsi, .str
   193 0000016A [D300000000000000]  <1>
   194 00000172 4889D1              <1>  mov rcx, rdx
   195 00000175 4889C2              <1>  mov rdx, rax
   196 00000178 B800000000          <1>  mov rax, 0
   197 0000017D E8(00000000)        <1>  call printf
   198                                  
   199 00000182 488B0425[00000000]      shla:	mov	rax,[raxsave]	; restore, destroyed by function
   200 0000018A 488B1425[08000000]      	mov	rdx,[rdxsave]	; restore, destroyed by function
   201 00000192 48C1E008                	shl	rax,8		; finish double shift, both registers
   202                                  	prt2	"shl rax,8     "; invoke the print macro
   203                              <1>  section .data
   204 000000E2 73686C207261782C38- <1> .str db %1,0
   205 000000EB 202020202000        <1>
   206                              <1>  section .text
   207 00000196 48BF-               <1>  mov rdi, fmt2
   208 00000198 [3700000000000000]  <1>
   209 000001A0 48BE-               <1>  mov rsi, .str
   210 000001A2 [E200000000000000]  <1>
   211 000001AA 4889D1              <1>  mov rcx, rdx
   212 000001AD 4889C2              <1>  mov rdx, rax
   213 000001B0 B800000000          <1>  mov rax, 0
   214 000001B5 E8(00000000)        <1>  call printf
   215                                  
   216 000001BA 488B0425[00000000]      shrd4:	mov	rax, [b64]	; data to shift
   217 000001C2 BA00000000              	mov	rdx,0		; register receiving bits
   218 000001C7 480FACC208              	shrd	rdx,rax,8	; shift
   219 000001CC 48890425[00000000]      	mov	[raxsave],rax	; save, destroyed by function
   220 000001D4 48891425[08000000]      	mov	[rdxsave],rdx	; save, destroyed by function
   221                                  	prt2	"shrd rdx,rax,8"; invoke the print macro
   222                              <1>  section .data
   223 000000F1 73687264207264782C- <1> .str db %1,0
   224 000000FA 7261782C3800        <1>
   225                              <1>  section .text
   226 000001DC 48BF-               <1>  mov rdi, fmt2
   227 000001DE [3700000000000000]  <1>
   228 000001E6 48BE-               <1>  mov rsi, .str
   229 000001E8 [F100000000000000]  <1>
   230 000001F0 4889D1              <1>  mov rcx, rdx
   231 000001F3 4889C2              <1>  mov rdx, rax
   232 000001F6 B800000000          <1>  mov rax, 0
   233 000001FB E8(00000000)        <1>  call printf
   234                                  
   235 00000200 488B0425[00000000]      shra:	mov	rax,[raxsave]	; restore, destroyed by function
   236 00000208 488B1425[08000000]      	mov	rdx,[rdxsave]	; restore, destroyed by function
   237 00000210 48C1E808                	shr	rax,8		; finish double shift, both registers
   238                                  	prt2	"shr rax,8     "; invoke the print macro
   239                              <1>  section .data
   240 00000100 736872207261782C38- <1> .str db %1,0
   241 00000109 202020202000        <1>
   242                              <1>  section .text
   243 00000214 48BF-               <1>  mov rdi, fmt2
   244 00000216 [3700000000000000]  <1>
   245 0000021E 48BE-               <1>  mov rsi, .str
   246 00000220 [0001000000000000]  <1>
   247 00000228 4889D1              <1>  mov rcx, rdx
   248 0000022B 4889C2              <1>  mov rdx, rax
   249 0000022E B800000000          <1>  mov rax, 0
   250 00000233 E8(00000000)        <1>  call printf
   251                                  
   252 00000238 5D                      	pop	rbp		; restore stack
   253 00000239 B800000000              	mov     rax,0           ; exit code, 0=normal
   254 0000023E C3                      	ret			; main returns to operating system
   255