【问题标题】:Why is my register-constant comparison not working in NASM Assembly?为什么我的寄存器常数比较在 NASM 大会中不起作用?
【发布时间】:2013-09-16 03:02:53
【问题描述】:

在 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 不是地址——它只是一个数字,所以我不能使用括号。我可能错了(在这种情况下,这可能是问题的原因)。

【问题讨论】:

    标签: linux ubuntu assembly nasm


    【解决方案1】:
    index   db  0
    msg1    db  "ECX < EBX",10
    
    mov  ecx, [index] 
    

    index被定义为db,所以指令会从msg1移动到ecx这0个和3个字节

    用途:

    index dd 0
    

    【讨论】:

    • 啊,当我意识到我所有的 NASM 程序都有这个问题的那一刻。谢谢!
    • 标准初学者错误。实际上,这仍然发生在我身上,如果我不注意,因为要解决的问题听起来“太容易了”:-)
    • 其实还是mov cl, [index]比较好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多