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 raxsave: resq 1 ; save rax while calling a function 51 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