まず最初に、これ、これ、およびこの質問を読んだということから始めたいと思います。それでも、これらの質問に対して提供された回答はどれも、私の質問に答えるのに十分ではなく、十分な詳細情報を持っていませんでした. さらに、それらはすべて 4 ~ 6 年前のものであり、時代遅れになっています。そうは言っても、ここで新しい質問を開きました。
NASM 構文を使用して Linux 32 ビット アセンブリで 1 ~ 4 行列を表示する簡単なプログラムを作成しようとしています。単純な 1x1 行列を出力する手順を作成しました。
section .data
msg1: db 'output:', 10
msg1len: equ $-msg1
endmsg: db 10
m1r1: db '5'
m2r1: db '1', '4'
m2r2: db '2', '6'
m3r1: db '8', '3', '4'
m3r2: db '9', '2', '1'
m3r3: db '1', '5', '6'
m4r1: db '6', '3', '1', '7'
m4r2: db '1', '9', '8', '4'
m4r3: db '5', '0', '1', '2'
m4r4: db '2', '7', '1', '0'
section .bss
output1: resb 5
output2: resb 7*2
output3: resb 9*3
output4: resb 11*4
section .text
global _start
_start:
mov eax, 1
call printMatrix
_exit:
mov eax, 0
mov ebx, 1
int 80h
;description:
; displays a visual representation of
; a matrix from size 1 through 4
;parameters:
; eax - matrix size
printMatrix:
push eax
push ebx
push ecx
push edx
push esi
cmp eax, 1
je .printMatrix1
cmp eax, 2
je .printMatrix2
cmp eax, 3
je .printMatrix3
cmp eax, 4
je .printMatrix4
.printMatrix1:
mov eax, '[ '
mov [output1], eax
mov eax, m1r1
mov [output1 + 2], eax
mov eax, ' '
mov [output1 + 3], eax
mov eax, ']'
mov [output1 + 4], eax
mov eax, 4
mov ebx, 1
mov ecx, [output1]
mov edx, 5
jmp .exit
.printMatrix2:
jmp .exit
.printMatrix3:
jmp .exit
.printMatrix4:
jmp .exit
.exit:
pop esi
pop edx
pop ecx
pop ebx
pop eax
ret
printEndl:
push eax
push ebx
push ecx
push edx
mov eax, 4
mov ebx, 1
mov ecx, endmsg
mov edx, 1
int 80h
pop edx
pop ecx
pop ebx
pop eax
ret
しかし、次の方法でコンパイルすると:
nasm -f elf32 matrix.asm
そして、次を使用してリンクします。
ld -m elf_i386 -s -o matrix matrix.o
エラーや警告はまったく表示されませんが、プログラムを実行する./matrix
とsegmentation fault (core dumped)
エラーが発生します。ここで、この質問は、セグメンテーション違反とは何か、およびそれが通常何によって引き起こされるのかについて、かなり適切な定義を提供したことに注意する必要がありますが、少し不明確でした. 私が求めるものは:
- メモリとアセンブリに関するセグメンテーションの適切な説明/定義。
- この特定のケースでの障害の原因(最初と 2 番目のリンクによると、ジャンプまたは呼び出しプロシージャとスタックに関係があると思われます。しかし、原因を突き止めようと何時間もここに座っていましたそれは成功しませんでした)。
- このような障害を回避する方法と、推奨される今後のプラクティス。