asm_notes.org
* asm
** gdb:::
resource ::
stop at main ::
view register ::info registers
show single reg ::print/(d|t|x) $eax
show memory value ::x/<num>(c|d|x)(b|h|w) x/42cb &output
(gdb) x/s $edi+28
0x600104 <output+28>: "GenuineIntel'\n"
** common
Code of helloworld.asm::
SECTION .data
EatMsg: db "hello world", 10
EatLen: equ $-EatMsg
SECTION .bss
SECTION .text
global _start
_start:
nop
mov eax, 4
mov ebx, 1
mov ecx, EatMsg
mov edx, EatLen
int 80H
mov eax, 1
mov ebx, 0
int 80H
Command to build::
[vagrant@vagrant-centos-6-64 vagrant]
helloworld.asm helloworld.o
[vagrant@vagrant-centos-6-64 vagrant]
helloworld helloworld.asm helloworld.o
[vagrant@vagrant-centos-6-64 vagrant]
hello world
dump all sections ::
08048080 <_start>:
8048080: 90 nop
8048081: b8 04 00 00 00 mov $0x4,%eax
8048086: bb 01 00 00 00 mov $0x1,%ebx
gcc output ::
gcc -E ::
compile wit debug info ::
dump code with assembly ::
int foo()
{
400684: 55 push %rbp
400685: 48 89 e5 mov %rsp,%rbp
400688: 48 83 ec 10 sub $0x10,%rsp
40068c: e8 a7 fe ff ff callq 400538 <mcount@plt>
int main()
{
400504: 55 push %rbp
400505: 48 89 e5 mov %rsp,%rbp
printf("Hello, World!\n");
400508: bf 18 06 40 00 mov $0x400618,%edi
40050d: e8 de fe ff ff callq 4003f0 <puts@plt>
exit(0);
400512: bf 00 00 00 00 mov $0x0,%edi
400517: e8 e4 fe ff ff callq 400400 <exit@plt>
dump out dynamic symbol table entries::
ctest: file format elf64-x86-64
DYNAMIC SYMBOL TABLE:
0000000000000000 w D *UND* 0000000000000000 __gmon_start__
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 puts
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 exit
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 __libc_start_main
dump dynamic entries::
Dynamic section at offset 0x2b0 contains 15 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
show used share libs::
libc.so.6 => /lib64/libc.so.6 (0x00007f0e83eb4000)
/lib/ld64.so.1 => /lib64/ld-linux-x86-64.so.2 (0x00007f0e8424f000)
mov:: movl(long word) movw(16-bit word) movb(byte) | movl %eax, %ebx | movw %ax %bx | movb %al %bh
conditional move:: movl value, %ecx | cmp %ebx, %ecx | cmova %ebx, %ecx
XCHG::exchange value between two general purpos registers, or betwen a register and a memory location.
when one of the operands is a memory location, the processor's LOCK signal is automatically asserted,
to turns the instruction into an atomic instruction in multiple processor environment.
CMPXCHG:: cmpxchg src dest | compare dest with EAX,AX,or AL. if equal, load src to dest.
otherwise load dest to EAX, AX, or AL.
unconditional branches::jump calls interrupts
call: 1) push the $eip, modifies the %eip to point to called function address
2) call function and ret
3) pop %eip to continue
asm function template::
function_label:
pushl %ebp
movl %esp, %ebp
<normal function code>
movl %ebp, %esp
popl %ebp
software interrupts::are provided by OS to enable app to tap info function into the OS. (system calls).
** resources
http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html
-->