0

32 ビット Ubuntu での NASM アセンブリの学習。

これは私に頭痛の種を与えています:私が配列(プログラムではベクトルと呼んでいます)を持っているとします.data:

vector db  1,2,3,4
size   equ $-vector

そして私も番号を持っています0:

index  db 0

に保存してから に保存し、size最後に かどうかを確認します。この例では、 になります。私のプログラムは単にそれをしません:EBXindexECXECX < EBX0 < 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住所ではないためだと推測しています.これは単なる数字なので、括弧を使用することはできません. 私が間違っている可能性があります (その場合、これが問題の原因である可能性があります)。

4

1 に答える 1

1
index   db  0
msg1    db  "ECX < EBX",10

mov  ecx, [index] 

indexとして定義されてdbいるため、命令はecxこの 0 に移動し、さらに 3 バイトからmsg1

使用する:

index dd 0
于 2013-09-16T04:06:44.473 に答える