⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 util.m

📁 compiler-compiler. This is a compiler-compiler with table-driven scanner, table-driven parser.
💻 M
📖 第 1 页 / 共 2 页
字号:
%%--------------------------------------------------------------%% 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 + -