0

このコードは、アセンブリに分解されたCプログラム(バブルソート)です。次のコードを.asmファイルに入れ、nasmを使用してアセンブルする場合、どうすれば実行できますか?何を変更する必要があるかがわかっている場合は、何に変更するかを言ってください。たとえば、nasmが受け入れないことは理解していますDWORD PTRが、代わりに何をすべきかわかりません。ありがとう

.file   "sort.c" .intel_syntax noprefix .text .globl 
sort .type   sort, @function
sort: .LFB0:
    .cfi_startproc
    push    rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    mov rbp, rsp
    .cfi_def_cfa_register 6
    mov QWORD PTR [rbp-24], rdi
    mov DWORD PTR [rbp-28], esi
    mov DWORD PTR [rbp-12], 0
    jmp .L2
.L6:
    mov DWORD PTR [rbp-8], 0
    jmp .L3
.L5:
    mov eax, DWORD PTR [rbp-8]
    cdqe
    sal rax, 2
    add rax, QWORD PTR [rbp-24]
    mov edx, DWORD PTR [rax]
    mov eax, DWORD PTR [rbp-8]
    cdqe
    add rax, 1
    sal rax, 2
    add rax, QWORD PTR [rbp-24]
    mov eax, DWORD PTR [rax]
    cmp edx, eax
    jle .L4
    mov eax, DWORD PTR [rbp-8]
    cdqe
    sal rax, 2
    add rax, QWORD PTR [rbp-24]
    mov eax, DWORD PTR [rax]
    mov DWORD PTR [rbp-4], eax
    mov eax, DWORD PTR [rbp-8]
    cdqe
    sal rax, 2
    add rax, QWORD PTR [rbp-24]
    mov edx, DWORD PTR [rbp-8]
    movsx   rdx, edx
    add rdx, 1
    sal rdx, 2
    add rdx, QWORD PTR [rbp-24]
    mov edx, DWORD PTR [rdx]
    mov DWORD PTR [rax], edx
    mov eax, DWORD PTR [rbp-8]
    cdqe
    add rax, 1
    sal rax, 2
    add rax, QWORD PTR [rbp-24]
    mov edx, DWORD PTR [rbp-4]
    mov DWORD PTR [rax], edx
.L4:
    add DWORD PTR [rbp-8], 1
.L3:
    mov eax, DWORD PTR [rbp-28]
    sub eax, 1
    sub eax, DWORD PTR [rbp-12]
    cmp eax, DWORD PTR [rbp-8]
    jg  .L5
    add DWORD PTR [rbp-12], 1
.L2:
    mov eax, DWORD PTR [rbp-28]
    sub eax, 1
    cmp eax, DWORD PTR [rbp-12]
    jg  .L6
    pop rbp
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE0:
    .size   sort, .-sort
    .ident  "GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3"
    .section    .note.GNU-stack,"",@progbits
4

1 に答える 1

0

削除するだけPTRで、すべての無意味.somethingsです。

これはうまく組み立てられます:

; file: gas-nasm-sort.asm
bits 64

sort:
push rbp
mov rbp, rsp
mov QWORD [rbp-24], rdi
mov DWORD [rbp-28], esi
mov DWORD [rbp-12], 0
jmp .L2

.L6:
mov DWORD [rbp-8], 0
jmp .L3

.L5:
mov eax, DWORD [rbp-8]
cdqe
sal rax, 2
add rax, QWORD [rbp-24]
mov edx, DWORD [rax]
mov eax, DWORD [rbp-8]
cdqe
add rax, 1
sal rax, 2
add rax, QWORD [rbp-24]
mov eax, DWORD [rax]
cmp edx, eax
jle .L4
mov eax, DWORD [rbp-8]
cdqe
sal rax, 2
add rax, QWORD [rbp-24]
mov eax, DWORD [rax]
mov DWORD [rbp-4], eax
mov eax, DWORD [rbp-8]
cdqe
sal rax, 2
add rax, QWORD [rbp-24]
mov edx, DWORD [rbp-8]
movsx rdx, edx
add rdx, 1
sal rdx, 2
add rdx, QWORD [rbp-24]
mov edx, DWORD [rdx]
mov DWORD [rax], edx
mov eax, DWORD [rbp-8]
cdqe
add rax, 1
sal rax, 2
add rax, QWORD [rbp-24]
mov edx, DWORD [rbp-4]
mov DWORD [rax], edx

.L4:
add DWORD [rbp-8], 1

.L3:
mov eax, DWORD [rbp-28]
sub eax, 1
sub eax, DWORD [rbp-12]
cmp eax, DWORD [rbp-8]
jg .L5
add DWORD [rbp-12], 1

.L2:
mov eax, DWORD [rbp-28]
sub eax, 1
cmp eax, DWORD [rbp-12]
jg .L6
pop rbp
ret

指示:

nasm gas-nasm-sort.asm -f bin -o gas-nasm-sort.bin

しかし、繰り返しになりますが、NASMのドキュメントがあります。それを読んで。特にこれらのセクション:

  • 2.2.2 NASMでは、メモリ参照用に角かっこが必要です

  • 2.2.3NASMは変数タイプを保存しません

于 2012-07-18T04:07:26.483 に答える