Assembly 跳转时的错误代码
我正在尝试学习汇编(特别是ideone.com上的nasm变体)。当我跳转到一个过程时,我得到了错误代码11,而当我调用这个过程时,没有错误。我已经试过了,在街区尽头有没有“ret”。请注意,仅当输入的长度为2时才调用_printOne过程,例如“a[newline]”。这是我的密码Assembly 跳转时的错误代码,assembly,nasm,Assembly,Nasm,我正在尝试学习汇编(特别是ideone.com上的nasm变体)。当我跳转到一个过程时,我得到了错误代码11,而当我调用这个过程时,没有错误。我已经试过了,在街区尽头有没有“ret”。请注意,仅当输入的长度为2时才调用_printOne过程,例如“a[newline]”。这是我的密码 global _start section .data sys_read equ 3 sys_write equ 4 max_line_len equ 10 stdi
global _start
section .data
sys_read equ 3
sys_write equ 4
max_line_len equ 10
stdin equ 0
oneStr db '1'
oneStrLen equ $ - oneStr
section .bss
line resb 10
segment .text
_start:
call _readLine ; stores value in line
cmp eax, dword 2 ; if input has length of 2, print out '1'
je _printOne ; No error if "call _printOne"!
mov eax, 01h ; exit()
xor ebx, ebx ; errno
int 80h
_readLine:
mov eax, sys_read ; syscall to read
mov ebx, stdin ; stdin
mov ecx, line ; put line into ecx
mov edx, max_line_len ; length to read
int 0x80
ret
_printOne:
mov eax, sys_write
mov ebx, stdout
mov ecx, oneStr
mov edx, oneStrLen
int 80h
ret
如果您只是在最后省略了
RET
,处理器将尝试执行内存中代码之后的任何垃圾,这可能是导致故障的原因
如果要进行条件调用,只需反转条件并跳过调用,例如:
cmp eax, dword 2
jne skip_print
call _printOne
skip_print:
mov eax, 1
xor ebx, ebx
int 80h
如果您不想将\u printOne
变成一个过程,那么您应该提供一种方法,让执行能够合理地继续,例如通过跳回退出,如下所示:
cmp eax, dword 2
je _printOne
exit:
mov eax, 1
xor ebx, ebx
int 80h
...
_printOne:
mov eax, sys_write
mov ebx, stdout
mov ecx, oneStr
mov edx, oneStrLen
int 80h
jmp exit
最后,建议:不要使用ideone学习汇编编程。在本地设置一个环境,特别是确保您有一个调试器,在那里您可以单步执行代码并查看发生了什么。非常感谢您的建议。我之所以使用ideone是因为我们在工作中有竞争,我们必须为我们的解决方案提供ideone链接;此外,我的work comp运行windows,而ideone nasm在Linux中运行