Skip to content

Assemblyでloopを回したい。 #1

@lemolatoon

Description

@lemolatoon

loopが回らない

print_b.s内で

# print_b.s
.global print

print:
    mov $0, %rcx
    jmp loop

loop:
    (略)
    inc %rcx
    cmp $0x10, %rcx
    je loop
    ret

としていて、loopが16回回るはずなのに、一回しか回らない。

コンソール
$ gcc -nostdlib substart.s print_b.s hello.c -o hello
$ ./hello
実行結果
aaa
H
Hello World
# substart.s
.global _start

_start:
    call main
        mov $60, %eax           # exit
        xor %rdi, %rdi          # mov $0, %rdi
        syscall
// hello.c
void print(const void* c);

int main(void) {
        char str[] = "Hello World";
        print(&"a");
        print(&"a");
        print(&"a");
        print(&"\n");
        print(&str);
        print(&"\n");
        for (int i = 0; i < sizeof(str) / sizeof(char); i++) {
                print(&str[i]);
        }
        print(&"\n");
        return 0;
}

push, popできない

syscall前後でrcxが破壊されていると考えてpush, popしようとして、コメントアウトを外した。でも、gccによると

print_b.s: Assembler messages:
print_b.s:13: Error: invalid instruction suffix for `push'
print_b.s:15: Error: invalid instruction suffix for `pop'

と言われ、アセンブルすらできない。

Metadata

Metadata

Assignees

No one assigned

    Labels

    help wantedExtra attention is needed

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions