diff --git a/asm/idiv.c b/asm/idiv.c new file mode 100644 index 0000000..6b04088 --- /dev/null +++ b/asm/idiv.c @@ -0,0 +1,20 @@ +#include + +int main() { + short a, b, c, d; + scanf("%hd %hd", &a, &b); + asm + ( + "mov %1,%%ax\n" + "mov %2,%%bx\n" + "cwd\n" + "idiv %%bx\n" + "mov %%ax, %%dx\n" + "mov %%dx, %0\n" + : "=r" (c) + : "r" (a), "r" (b) + ); + printf("%hd\n", c); +} + + diff --git a/asm/solutions.md b/asm/solutions.md index f8ff1ae..2b2bede 100644 --- a/asm/solutions.md +++ b/asm/solutions.md @@ -1,46 +1,153 @@ # zero ``` -xor eax, eax +xor %eax, %eax ``` # one ``` -xor eax, eax -inc eax +xor %eax, %eax +inc %eax ``` # next ``` -inc ax +inc %ax ``` # prev ``` -dec ax +dec %ax ``` # sum ``` -mov dx, ax -add dx, bx +mov %ax, %dx +add %bx, %dx ``` # sub ``` -mov rdx, rax -sub rdx, rbx +mov %rax, %rdx +sub %rbx, %rdx ``` # imul ``` -imul bl -mov dx, ax +imul %bl +mov %ax, %dx ``` # idiv ``` cwd -idiv bx -mov dx, ax +idiv %bx +mov %ax, %dx +``` + +# lea +``` +lea (%rax, %rbx, 8), %rdx +``` + +# lea1 +``` +lea (%rax, %rax, 4), %rdx +``` + +# lea32 +``` +lea (%eax, %ebx, 8), %edx +``` + +# egalite +``` +cmp %ax, %bx +jne nya +mov $1, %dx +jmp nya_ +nya: +mov $0, %dx +nya_: +``` + +# factorial +``` +xor %edx, %edx +inc %edx +cmp $0, %al +je end +mov %al, %cl +mov %ecx, %eax +loop: +cmp $1, %ecx +mov %eax, %edx +jle end +dec %ecx +mul %ecx +jmp loop +end: +``` + +# factorial64 +``` +xor %rdx, %rdx +inc %rdx +cmp $0, %al +je end +mov %al, %cl +mov %rcx, %rax +loop: +cmp $1, %rcx +mov %rax, %rdx +jle end +dec %rcx +mul %rcx +jmp loop +end: +``` +# antifa +``` +xor %ecx, %ecx +inc %ecx +loop: +cmp $1, %eax +je end +inc %ecx +cdq +div %ecx +jmp loop +end: +mov %ecx, %ebx +``` + +# antifa64 +``` +xor %rcx, %rcx +inc %rcx +loop: +cmp $1, %rax +je end +inc %rcx +cqo +div %rcx +jmp loop +end: +mov %rcx, %rbx +``` + +# vector +``` +xor %rbx, %rbx +cmp $0, %rcx +je end +dec %rcx +loop: +lea (%rax, %rcx, 8), %rdx +add (%rdx), %rbx +dec %rcx +cmp $-1, %rcx +je end +jmp loop +end: ``` diff --git a/asm/vector.c b/asm/vector.c new file mode 100644 index 0000000..ca67fc1 --- /dev/null +++ b/asm/vector.c @@ -0,0 +1,40 @@ +#include +#include + +int main() { + //uint64_t c = 5; + uint64_t b, c = 5; + int64_t *a; + int64_t array[] = {1, 2, 3, 4, 5}; + a = array; + //printf("pointer: %p\n", a); + asm ( + "mov %1, %%rax\n" + "mov %2, %%rcx\n" + + "xor %%rbx, %%rbx\n" + "cmp $0, %%rcx\n" + "je end\n" + + "dec %%rcx\n" + + "loop:\n" + + "lea (%%rax, %%rcx, 8), %%rdx\n" + "add (%%rdx), %%rbx\n" + "dec %%rcx\n" + + "cmp $-1, %%rcx\n" + "je end\n" + "jmp loop\n" + + "end:\n" + + + "mov %%rbx, %0\n" + : "=r" (b) + : "r" (a), "r" (c) + ); + printf("%lld\n", b); + +}