-8

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

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
4

3 回答 3

2

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

与此同时,您的程序中的代码不正确或多余_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调用 (code) 部分test吗?

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

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
于 2013-07-31T08:47:32.207 回答
2

除了其他答案所涵盖的内容之外,这一行是不正确的:

int eax, 4

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

于 2013-07-31T11:15:01.093 回答
0

编辑

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

/编辑

于 2013-07-31T08:59:09.390 回答