我在谷歌寻找方法来做到这一点,我发现了一些,但我发现它们对我所需要的东西过于复杂。对于初学者来说,我需要通过一个循环来完成,我放置字符串的地方最初也是空的,所以我确信这肯定会产生一些问题。
无论如何这是我的代码:
%include "io.mac"
.DATA
filename_msg db 'Enter the file name: ', 0
number_prompt_msg db 'Enter the number of bases: ',0 ;asks for the number of bases to be used
finish_msg db 'Operation completed, DNA file generated',0 ;tells the user when the file is complete
error_msg db 'Operation failed, please try again', 10
base_A db 'A',0
base_C db 'C',0
base_G db 'G',0
base_T db 'T',0
base_length equ $ - base_A
;----------------------------------------------------------------------------------------------------
.UDATA
number_of_bases rest 1 ;defined by the user
random_number resb 1
filename: resd 20 ;defined by the user
base rest 1
file_descriptor resd 1 ;used to generate the file
characters_to_write rest 1
;-------------------------------------------------------------------
;start of code, and message prompts for the user
.CODE
.STARTUP
;asks user for filename
ask_details:
PutStr filename_msg
GetStr filename, 300
;asks user for the number of bases
PutStr number_prompt_msg
GetLInt [number_of_bases]
;------------------------------------------------------------
;file creation
mov EAX, 8 ;creates the file
mov EBX, filename
mov ECX, 644O ;octal instruction
int 80h ;kernel interrupt
cmp EAX,0 ;throws error if something is amiss
jbe error
mov [file_descriptor],EAX
mov ECX,[number_of_bases]
;-------------------------------------------------------------
;randomization of base numbers
writing_loop:
rdtsc
mov EAX, EDX
mov EDX, 0
div ECX
mov EDX, 0
mov EBX, 4
div EBX
mov [random_number], EDX
mov EDX, 0
mov EAX,[random_number]
cmp EAX,0
je assignment_A
cmp EAX,1
je assignment_C
cmp EAX,2
je assignment_G
cmp EAX,3
je assignment_T
join_char:
mov [base + EBX],EBX
loop writing_loop
PutStr base
.EXIT
;------------------------------------------------------------
;file generation error message
error:
PutStr error_msg
jmp ask_details
;------------------------------------------------------------
;assignments
assignment_A:
mov EBX, [base_A]
jmp join_char
assignment_C:
mov EBX, [base_C]
jmp join_char
assignment_T:
mov EBX, [base_T]
jmp join_char
assignment_G:
mov EBX, [base_G]
jmp join_char
首先,它将我用rdtsc获得的一些随机数进行比较,根据出现的情况,它会给EBX分配一个字母,然后该字母(base_A,base_C,base_T或base_G)应该进入base
。我试过用
mov [base + EBX],EBX
但是那只是打印了一个空的空间,我使用了它,因为它似乎适用于我看过的例子中,但我不确定连接在NASM中是如何工作的。如果可能的话,我不知道是否有人知道将这些字符连接在一起的任何简单方法。这真的很小,所以我希望我不需要添加很多代码,我需要这个字符串的唯一方法就是稍后将其写入文件中。我会在没有字符串的情况下这样做但我需要所有寄存器写入文件,所以我不能一字母写。
编辑:我需要知道的是如何在每个字母被挑选后加入。例如,Base是空的,然后在拾取一个字母后,它会被抛入其中,但是在循环再次运行之后,将会选择另一个字母,并且我需要在完成所有操作后将其添加到base。