📄 util.m
字号:
%%--------------------------------------------------------------%% gtstr %%--------------------------------------------------------------%% Check if string1 > string2.% Entry : address of string1 -> r1% address of string2 -> r2% Exit : r1 = 1 (true)% r1 = 0 (false)%gtstr align add r3,r0,r0 % Initialize r3 (r3 = 0) add r4,r0,r0 % Initialize r4 (r4 = 0)gtstr1 lb r3,0(r1) % Load ch1 from 1st string lb r4,0(r2) % Load ch2 from 2nd string cgt r5,r3,r4 % ch1 > ch2 ? bnz r5,gtstr3 % Branch if true clt r5,r3,r4 % ch1 < ch2 ? bnz r5,gtstr2 % Branch if true ceq r5,r3,r0 % ch1 = '\0' ? bnz r5,gtstr2 % Branch if true addi r1,r1,1 % i++ addi r2,r2,1 % j++ j gtstr1 % Loop if not finishedgtstr2 add r1,r0,r0 % Return false j gtstr4gtstr3 addi r1,r0,1 % Return truegtstr4 jr r15 % Return to the caller align%%%--------------------------------------------------------------%% gtestr %%--------------------------------------------------------------%% Check if string1 >= string2.% Entry : address of string1 -> r1% address of string2 -> r2% Exit : r1 = 1 (true)% r1 = 0 (false)%gtestr align add r3,r0,r0 % Initialize r3 (r3 = 0) add r4,r0,r0 % Initialize r4 (r4 = 0)gtestr1 lb r3,0(r1) % Load ch1 from 1st string lb r4,0(r2) % Load ch2 from 2nd string cgt r5,r3,r4 % ch1 > ch2 ? bnz r5,gtestr3 % Branch if true clt r5,r3,r4 % ch1 < ch2 ? bnz r5,gtestr2 % Branch if true ceq r5,r3,r0 % ch1 = '\0' ? bnz r5,gtestr3 % Branch if true addi r1,r1,1 % i++ addi r2,r2,1 % j++ j gtestr1 % Loop if not finishedgtestr2 add r1,r0,r0 % Return false j gtestr4gtestr3 addi r1,r0,1 % Return truegtestr4 jr r15 % Return to the caller align%%%--------------------------------------------------------------%% ltstr %%--------------------------------------------------------------%% Check if string1 < string2.% Entry : address of string1 -> r1% address of string2 -> r2% Exit : r1 = 1 (true)% r1 = 0 (false)%ltstr align add r3,r0,r0 % Initialize r3 (r3 = 0) add r4,r0,r0 % Initialize r4 (r4 = 0)ltstr1 lb r3,0(r1) % Load ch1 from 1st string lb r4,0(r2) % Load ch2 from 2nd string clt r5,r3,r4 % ch1 < ch2 ? bnz r5,ltstr3 % Branch if true cgt r5,r3,r4 % ch1 > ch2 ? bnz r5,ltstr2 % Branch if true ceq r5,r3,r0 % ch1 = '\0' ? bnz r5,ltstr2 % Branch if true addi r1,r1,1 % i++ addi r2,r2,1 % j++ j ltstr1 % Loop if not finishedltstr2 add r1,r0,r0 % Return false j ltstr4ltstr3 addi r1,r0,1 % Return trueltstr4 jr r15 % Return to the caller align%%%--------------------------------------------------------------%% ltestr %%--------------------------------------------------------------%% Check if string1 <= string2.% Entry : address of string1 -> r1% address of string2 -> r2% Exit : r1 = 1 (true)% r1 = 0 (false)%ltestr align add r3,r0,r0 % Initialize r3 (r3 = 0) add r4,r0,r0 % Initialize r4 (r4 = 0)ltestr1 lb r3,0(r1) % Load ch1 from 1st string lb r4,0(r2) % Load ch2 from 2nd string clt r5,r3,r4 % ch1 < ch2 ? bnz r5,ltestr3 % Branch if true cgt r5,r3,r4 % ch1 > ch2 ? bnz r5,ltestr2 % Branch if true ceq r5,r3,r0 % ch1 = '\0' ? bnz r5,ltestr3 % Branch if true addi r1,r1,1 % i++ addi r2,r2,1 % j++ j ltestr1 % Loop if not finishedltestr2 add r1,r0,r0 % Return false j ltestr4ltestr3 addi r1,r0,1 % Return trueltestr4 jr r15 % Return to the caller align%%%--------------------------------------------------------------%% lenstr %%--------------------------------------------------------------%% Returns length of string. '\n' is concidered one char.% Entry : address of string -> -8(r14)% Exit : result -> -12(r14)%lenstr align sw -4(r14),r15 % Store link in stack sw -16(r14),r1 % Save registers' old values on stack sw -20(r14),r2 sw -24(r14),r3 sw -28(r14),r4 lw r1,-8(r14) % Retrieve argument from stack add r2,r0,r0 % Initialize length counter (len = 0) add r3,r0,r0 % Initialize ch holder (r3 = 0)lenstr1 lb r3,0(r1) % Load ch from string ceq r4,r3,r0 % ch = '\0' ? bnz r4,lenstr2 % Branch if true addi r1,r1,1 % i++ ceqi r4,r3,13 % ch = LF ? bnz r4,lenstr1 % Skip ch and loop addi r2,r2,1 % len++ j lenstr1 % Loop if not finishedlenstr2 add r1,r0,r2 % Return length of the string sw -12(r14),r1 % Save result on stack lw r1,-16(r14) % Reset registers to their old values lw r2,-20(r14) lw r3,-24(r14) lw r4,-28(r14) lw r15,-4(r14) % Load link from stack jr r15 % Return to the caller align%%%--------------------------------------------------------------%% ordstr %%--------------------------------------------------------------%% Returns ASCII number of the 1st char of a string.% Entry : address of string -> -8(r14)% Exit : result -> -12(r14)%ordstr align sw -4(r14),r15 % Store link in stack sw -16(r14),r1 % Save registers' old values on stack sw -20(r14),r2 lw r1,-8(r14) % Retrieve argument from stack add r2,r0,r0 % Initialize ch holder (r2 = 0) lb r2,0(r1) % Load ch from string add r1,r0,r2 % Return ascii code of ch sw -12(r14),r1 % Save result on stack lw r1,-16(r14) % Reset registers to their old values lw r2,-20(r14) lw r15,-4(r14) % Load link from stack jr r15 % Return to the caller align%%%--------------------------------------------------------------%% substr %%--------------------------------------------------------------%% Returns the start & end pos. of a substring. '\n' is concidered% one char. Returns empty string in case of illegal start and/or% substring pos.% Entry : address of string -> -8(r14)% substring start pos. -> -12(r14)% substring end pos. -> -16(r14)% Exit : address of substring start pos. -> -20(r14)% address of substring end pos. -> -24(r14)%substr align sw -4(r14),r15 % Store link in stack sw -28(r14),r1 % Save registers' old values on stack sw -32(r14),r2 sw -36(r14),r3 sw -40(r14),r4 sw -44(r14),r5 sw -48(r14),r6 lw r1,-8(r14) % Retrieve arguments from stack lw r2,-12(r14) lw r3,-16(r14) add r5,r0,r0 % Initialize copy reg (r5 = 0) cle r4,r2,r0 % N < 0 ? bnz r4,substr4 % Branch if true cle r4,r2,r3 % M <= N ? bz r4,substr4 % Branch if true add r2,r2,r1 % Start pos. of the substr. in memory subi r2,r2,1 add r3,r3,r1 % End pos. of substr. in memory subi r3,r3,1substr1 lb r5,0(r1) % Load ch in copy register starting from ch1 ceq r6,r5,r0 % ch = '\0' ? bnz r6,substr4 % Branch if true ceq r4,r2,r1 % Current pos. = Start pos. ? bnz r4,substr2 % Branch if true ceqi r6,r5,13 % ch = LF ? bz r6,substr6 % Branch if false addi r2,r2,1 % Move start pos addi r3,r3,1 % Move end possubstr6 addi r1,r1,1 % Move current pos. j substr1 % Loop if current pos. != start pos.substr2 lb r5,0(r2) % Load ch in copy register starting from star pos. ceq r6,r5,r0 % ch = '\0' ? bnz r6,substr4 % Branch if true ceqi r6,r5,13 % ch = LF ? bz r6,substr7 % Branch if false addi r3,r3,1 % Move end possubstr7 ceq r4,r3,r2 % Current pos. = end pos. ? bnz r4,substr3 % Branch if true addi r2,r2,1 % Move current pos. j substr2 % Loop if current pos. != end pos.substr3 lb r5,0(r3) % Load ch of end pos. in copy register ceq r6,r5,r0 % ch = '\0' ? bnz r6,substr4 % Branch if true j substr5substr4 addi r1,r0,EMPTY % Start & end pos. pointing to "" addi r3,r0,EMPTYsubstr5 sw -20(r14),r1 % Store results on stack sw -24(r14),r3 lw r1,-28(r14) % Reset regiters to old values lw r2,-32(r14) lw r3,-36(r14) lw r4,-40(r14) lw r5,-44(r14) lw r6,-48(r14) lw r15,-4(r14) % Load link from stack jr r15 % Return to caller alignEMPTY db 0 % Empty string align%%%------------------------- End of file -----------------------%
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -