Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 这个汇编代码有什么问题?_Assembly_X86 - Fatal编程技术网

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

Assembly 这个汇编代码有什么问题?,assembly,x86,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

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

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

通常,汇编程序会告诉你哪一行是错误的,你应该检查操作码和操作数以确保兼容性(或者,至少让我们知道它是哪一行)

同时,在
\u start
刚开始时,您的程序中有不正确或多余的代码:

mov eax, 4
mov eax, 1 ; probably should be ebx
如果这些是Linux调用,您可能很幸运它没有组装。将随机长度传递给
sys\u write
会引起各种痛苦:-)也不建议将随机退出值传递给
sys\u exit

mov eax, 1
mov eax, 0 ; probably should be ebx
int 80h
您确定要将
文本
(code)部分称为
测试

通过使用
eq
值,而不是使用幻数和添加注释,您还可以大大提高代码的可读性:

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
编辑

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


/编辑

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

int eax, 4

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

汇编程序报告哪一行包含错误?您使用的是哪种汇编器?
movecx,name
是有效的NASM语法(OP似乎正在使用这种语法)。它在MASM/TASM语法中相当于
mov ecx,OFFSET name
。@Michael谢谢!然而,我想知道,在这种情况下,问题的根源可能是什么——其他所有操作码的使用都是完美的。在
global\u开始时:
我不认为冒号是必要的/合法的,汇编程序也可能会抱怨这个事实,但肯定没有操作码。代码非常简单,因此可以根据错误消息立即发现错误。也许它不是完整的源代码?@Michael…但是对于这个简单的代码来说,似乎没有其他东西是合乎逻辑的。。。顺便说一句,谢谢。那真是个奇怪的问题。期待解决办法。@Michael aaaaaah是不是
[BITS32]
丢失了???该死的,我错过了那个!很好+1实际上,这一个可能是赢家。将eax作为int操作码的操作数肯定是不匹配的。