【问题标题】:What is wrong with this assembly code? [closed]这个汇编代码有什么问题? [关闭]
【发布时间】:2013-07-31 16:33:42
【问题描述】:

它说操作码和操作数的组合无效

section .data
    name:      db "What is your name?"
    name_L:     equ $-name
    hello:     db "Hello"
    hello_L:     equ $-hello
section .bss
    name_V     resb 255



section .test


    global _start:
_start:

    mov eax, 4
    mov eax, 1
    mov ecx, name
    mov edx, name_L
    int 80h
    mov eax, 3
    mov ebx, 0
    mov ecx, name_V
    mov edx, 255
    int 80h
    int eax, 4
    mov ebx, 1
    mov ecx, hello
    mov edx, hello_L
    int 80h
    mov eax, 4
    mov ebx, 1
    mov ecx, name_V
    mov edx, 255
    int 80h
    mov eax, 1
    mov eax, 0
    int 80h

【问题讨论】:

  • 汇编器报告哪一行包含错误?您使用的是哪个汇编程序?

标签: assembly x86


【解决方案1】:

好吧,通常情况下,汇编器实际上会告诉你哪一行是有问题的,你应该检查操作码和操作数以确保兼容性(或者,至少,让 我们知道它是哪一行)。

与此同时,您的程序中在_start 之后有错误或多余的代码:

mov eax, 4
mov eax, 1 ; probably should be ebx

如果这些是 Linux 调用,你可能很幸运它没有组装。将随机长度传递给sys_write 会导致各种悲痛:-) 也不建议将随机退出值传递给sys_exit

mov eax, 1
mov eax, 0 ; probably should be ebx
int 80h

您是否确定希望将text(代码)部分称为test

您还可以通过使用equ 值而不是幻数并添加 cmets 来使您的代码具有可读性:

fn_exit    equ 0
fb_read    equ 3
fn_write   equ 4
:
mov eax, fn_write      ; write 
mov ebx, 1             ;  to stdout (fd 1)
mov ecx, name          ;  text to write
mov edx, name_L        ;  length of text to write

【讨论】:

    【解决方案2】:

    编辑

    我在您的代码中没有看到 [BITS32] 指令,如果您的汇编程序的默认模式是 16 位,这可能会导致尝试将 16 位偏移加载到您的 32 位寄存器中

    /编辑

    【讨论】:

    • mov ecx, name 是有效的 NASM 语法(这是 OP 似乎正在使用的语法)。它相当于 MASM/TASM 语法中的mov ecx,OFFSET name
    • @Michael 谢谢!但是,我想知道在这种情况下问题的根源可能是什么,其他所有 opcode 用法都是完美无缺的。在global _start:,我不认为冒号是必要的/合法的,汇编程序也可能会抱怨这个事实,但那里绝对没有 opcode。该代码很简单,因此如果存在错误,可以根据错误消息立即发现错误。也许它不是完整的来源?
    • @Michael ...但是对于这个简单的代码似乎没有其他任何东西是合乎逻辑的...谢谢顺便说一句。这真是一个奇怪的问题。期待解决方案。
    • @Michael AAAAAAAAAAAH 不是[BITS32] 不见了吗???
    【解决方案3】:

    除了其他答案所涵盖的内容外,此行不正确:

    int eax, 4
    

    我假设它应该是 mov 指令而不是 int

    【讨论】:

    • 该死的我错过了那个!好的! +1
    • 其实这个应该是赢家了。将 eax 作为 int 操作码的操作数肯定不匹配。
    猜你喜欢
    • 1970-01-01
    • 2015-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 2011-03-30
    相关资源
    最近更新 更多