32 ビット Ubuntu での NASM アセンブリの学習。
これは私に頭痛の種を与えています:私が配列(プログラムではベクトルと呼んでいます)を持っているとします.data
:
vector db 1,2,3,4
size equ $-vector
そして私も番号を持っています0
:
index db 0
に保存してから に保存し、size
最後に かどうかを確認します。この例では、 になります。私のプログラムは単にそれをしません:EBX
index
ECX
ECX < EBX
0 < 4
SECTION .data
vector db 1,2,3,4
size equ $-vector
index db 0
; Vocabulary
msg1 db "ECX < EBX",10
msg1len equ $-msg1
msg2 db "ECX >= EBX",10
msg2len equ $-msg2
SECTION .text
global main
main:
; -----------------------------------------------
; MAIN
; -----------------------------------------------
mov EBX,size ; EBX = 4
mov ECX,[index] ; ECX = 0
call check ; Check ECX < EBX (0 < 4)
; -----------------------------------------------
; EXIT
; -----------------------------------------------
mov EAX,1
int 0x80
; -----------------------------------------------
; Check
; Checks whether ECX < EBX
; -----------------------------------------------
check:
cmp ECX,EBX
jge greater_or_equal
mov EAX,4
mov EBX,0
mov ECX,msg1
mov EDX,msg1len
int 0x80
jmp end_check
greater_or_equal:
mov EAX,4
mov EBX,0
mov ECX,msg2
mov EDX,msg2len
int 0x80
end_check:
ret
以下を出力します。
ECX >= EBX
しかし、それは正しくありません。ECX
は 0 でありEBX
、4 である必要があります。
問題はわかりませんが、次のような観察があります。
mov EBX,size
この行は私を悩ませます-私はこれをやりたかった:
mov EBX,[size]
しかし、セグメンテーション違反が発生します。私はそれが起こるとは知りませんでしたが、それはsize
住所ではないためだと推測しています.これは単なる数字なので、括弧を使用することはできません. 私が間違っている可能性があります (その場合、これが問題の原因である可能性があります)。