它表示操作码和操作数的无效组合
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
答案 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位
/ EDIT