在32位Ubuntu中学习NASM程序集。
这令我头疼:假设我在.data
中有一个数组(我在程序中称之为vector):
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&gt; = EBX
但那是不对的。 ECX
应为0,EBX
应为4.
我没有看到问题 - 但我确实有观察结果:
mov EBX,size
这条线让我烦恼 - 我想这样做:
mov EBX,[size]
但是我会遇到分段错误。我不知道会发生什么,但我猜这是因为size
不是地址 - 它只是一个数字,所以我不能使用括号。我可能错了(在这种情况下,这可能是导致问题的原因)。
答案 0 :(得分:1)
index db 0
msg1 db "ECX < EBX",10
mov ecx, [index]
index
定义为db
,因此指令将移至ecx
{0}来自msg1
使用:
index dd 0