这个汇编代码有什么问题?

时间:2013-07-31 08:39:01

标签: assembly x86

它表示操作码和操作数的无效组合

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

3 个答案:

答案 0 :(得分: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(代码)部分称为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

答案 1 :(得分:2)

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

int eax, 4

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

答案 2 :(得分:0)

修改

我的代码中没有看到[BITS32]指令,如果汇编程序的默认模式是16位

,可能会导致尝试将16位偏移量加载到32位寄存器中

/ EDIT