如何解决x86 32 位汇编中的 BrainF*ck 解释器
我开始用 32 位 x86 程序集为我的操作系统编写 BrainF*ck 解释器。我已经用 C 编写了一个可以正常工作的程序,并尝试在汇编中实现它,但是用汇编编写的那个没有打印任何输出。
我对组装还是个新手,所以我想我只是犯了一些初学者的错误。我唯一能想到的是我在某处搞砸了地址。 如果有人能指出我做错了什么,我会非常高兴。
我用相同的输入测试了 C 和汇编程序:
$(document).ready(function () { // my RegEx works well,verified it on regex101
let col_let_num = $('body').html().replace(/\bcol\b(\-[a-z]{0,2})?(\-)?([0-9]{0,2})?/i,'col-12')
$('body').html(col_let_num)
})
它应该打印 -[--->+<]>---.+[----->+++<]>.[--->+<]>+.[--->++<]>-.++++.
如果这有助于理解我要完成的任务,我创建了我的 C 代码的粘贴箱: pastebin
我的汇编代码如下:
RexOS
解决方法
我终于解决了这个问题。我需要做的就是将指针增量移动到循环的末尾,并在序言 (ebx) 中保存额外的寄存器,然后在尾声中恢复寄存器。还需要保存和恢复prnt和scan部分的寄存器。
我的最终工作代码如下所示:
.intel_syntax noprefix
.section .data
TAPE:
.zero 30000
.section .text
.global interpret
interpret:
push ebp // prologue
mov ebp,esp
push ebx
xor eax,eax // loop counter
mov ebx,offset TAPE // a pointer to the tape
mov edx,[ebp+8] // getting the input string
clrt: // clear TAPE
cmp eax,30000
je loop
mov byte ptr [ebx+eax],0
inc eax
jmp clrt
loop:
mov cl,byte ptr [edx] // getting the current char
cmp cl,0 // if we reached the end of the string
je exit // return the length
cmp cl,'>'
je pinc // increment the pointer
cmp cl,'<'
je pdec // decrement the pointer
cmp cl,'+'
je vinc // increment value at index
cmp cl,'-'
je vdec // decrement value at index
cmp cl,'.'
je prnt // print the value at index
cmp cl,','
je read // read character from stdin
cmp cl,']'
je bend // end of bracket
ptlp: // postloop
inc edx // increment the input pointer
jmp loop // continue the loop
pinc:
inc ebx
jmp ptlp
pdec:
dec ebx
jmp ptlp
vinc:
inc byte ptr [ebx]
jmp ptlp
vdec:
dec byte ptr [ebx]
jmp ptlp
prnt:
push edx
push dword ptr [ebx]
call putchar
add esp,4
pop edx
jmp ptlp
read:
push edx
call getchar
mov byte ptr [ebx],al
pop edx
jmp ptlp
bend:
cmp byte ptr [ebx],0
je ptlp
mov ch,1
ilst:
cmp ch,0
jle ptlp
dec edx // jump to the previous index
mov cl,'['
je dclp // decrease internal loop counter
cmp cl,']'
je inlp // increase internal loop counter
jmp ilst
inlp:
inc ch
jmp ilst
dclp:
dec ch
jmp ilst
exit:
pop ebx // epilogue
mov esp,ebp
pop ebp
ret
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。