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操作码的操作数肯定是不匹配的。