我想编写一个8086汇编程序,将用户的5个字符串作为输入,然后对这些字符串进行排序并将排序结果打印为输出。我实际上什么都做,但我在排序部分有一个大问题。我知道如何使用例如气泡排序来对数组中从特定地址开始的项目进行排序,但在这里我有5个不同的字符串,它们不在同一个数组中。每个字符串都有自己的地址和自己的字符。我尝试将每个字符串的最后一个字符相互比较,然后如果一个比另一个大,我将整个字符串交换,然后我继续将所有字符串的整个字符交换到第一个。
例如,如果我们的输入字符串是:
eab
abe
cbd
cda
adb
我将首先对每个字符串的最后一个字符进行排序,并得出以下结果:
cda
eab
adb
cbd
abe
然后我将通过中间字符来比较它们:
eab
cbd
abe
cda
adb
最后是第一个字符,所有内容都被排序:
abe
adb
cbd
cda
eab
但这实际上是我的想法,我不知道谁来为我的工作实施。
; multi-segment executable file template. data segment data1 db 64,?,64 dup(?) data2 db 64,?,64 dup(?) data3 db 64,?,64 dup(?) data4 db 64,?,64 dup(?) data5 db 64,?,64 dup(?) change db 66 dup(?) msg db 0ah,0dh,"You enter a wrong option",0ah,0dh,"try again",0ah,0dh,"$" prompt db 0ah,0dh,"Choose an option:",0ah,0dh,"$" prompt1 db ".a: Sort in ascending order",0ah,0dh,"$" prompt2 db ".d: Sort in descending order",0ah,0dh,"$" prompt3 db ".q: Quit",0ah,0ah,0dh,"$" enter db 0ah,0ah,0dh,"Enter 5 strings:",0ah,0dh,"$" pkey db 0ah,0dh,"press any key...$" ends stack segment dw 128 dup(0) ends code segment main proc far ; set segment registers: mov ax, data mov ds, ax mov es, ax again: ; printing the prompts for the user lea dx, prompt mov ah, 09h int 21h lea dx, prompt1 mov ah, 09h int 21h lea dx, prompt2 mov ah, 09h int 21h lea dx, prompt3 mov ah, 09h int 21h ; getting a character from the user as an input mov ah, 01h int 21h ; determining which option the user selects cmp al, 'a' je ascending cmp al, 'd' je descending cmp al, 'q' je quit ; this is for the time that the user enters a wrong char lea dx, msg mov ah, 09h int 21h jmp again ; again calling the application to start ascending: call input call AscendSort jmp again ; again calling the application to start descending: call input call DescendSort jmp again ; again calling the application to start quit: lea dx, pkey mov ah, 9 int 21h ; output string at ds:dx ; wait for any key.... mov ah, 1 int 21h mov ax, 4c00h ; exit to operating system. int 21h main endp ;................................................. ; this subroutine gets input from user input proc lea dx, enter mov ah, 09h int 21h call newline mov ah, 0ah lea dx, data1 int 21h call newline mov ah, 0ah lea dx, data2 int 21h call newline mov ah, 0ah lea dx, data3 int 21h call newline mov ah, 0ah lea dx, data4 int 21h call newline mov ah, 0ah lea dx, data2 int 21h call newline ret input endp ;................................................ ; sorting the strings in the ascending order AscendSort proc mov si, 65 lea dx, change mov al, data1[si] cmp al, data2[si] ja l1 ????? ret AscendSort endp ;................................................ ; sorting the strings in the descending order DescendSort proc ret DescendSort endp ;................................................ ; newline newline proc mov ah, 02h mov dl, 0ah int 21h mov dl, 0dh int 21h ret newline endp ends end main ; set entry point and stop the assembler.
对这些字符串进行排序的任何其他算法也将受到赞赏。
实际上我自己找到了答案,我使用字符串命令将字符串2乘2进行比较,看看它们是大是小还是相等。类似于特定宏中的以下代码,该宏需要两个字符串来检查它们,并执行所需的操作,如交换字符串以使其排序:
check macro a, b
local next, finish
cld
mov cx, 64 ; the size of our buffer that saves the string
mov si, a
mov di, b
repe cmpsb ; comparing two strings with each other
ja next
jmp finish
next:
; swaping our strings if needed
mov cx, 64
mov si, a
lea di, change
rep movsb
mov cx, 64
mov si, b
mov di, a
rep movsb
mov cx, 64
lea si, change
mov di, b
rep movsb
finish:
endm
在我看来最好的情况应该是O(log n),但不确定最坏的情况...也许O(n^2)一次只能匹配一个字母。 谁能给我更多的点子吗?
问题内容: 我最近遇到了一个我以前从未见过的习惯用法:StringWriter和PrintWriter进行的字符串汇编。我的意思是,我知道如何使用它们,但是我一直使用StringBuilder。是否有具体的理由偏爱一个?对我来说,StringBuilder方法似乎更自然,但这只是样式吗? 我在这里查看了几个问题(包括最接近的一个问题:StringWriter或StringBuilder),但没有一
在x86汇编语言中,是否有任何有效的方法将字节转换为二进制数字字符串(表示为0和1的字节数组)?据我所知,x86汇编中没有任何“toString”函数,就像大多数高级编程语言一样。
按字母顺序排序字符串中的字符。 使用扩展运算符(...),Array.sort() 和 String.localeCompare() 对 str 中的字符进行排序,使用 String.join('') 重新组合。 const sortCharactersInString = str => [...str] .sort((a, b) => a.localeCompare(b))
问题内容: 我有默认的字符串比较器(在SortedSet中)有问题。问题是默认比较器不能对包含数字的好的字符串进行排序,即:在集合中,我具有: 自然排序应该与上面类似,但是在集合中我有: 我知道为什么会这样,但是我不知道如何更改它。 问题答案: 尝试使用此比较器,该比较器将删除所有非数字字符,然后将其余字符与数字进行比较: 这是一个测试: 输出: 当数字为小数时(也表示Java 8+样式): 结果
我的代码中有什么错误? 给定一个由小写字母组成的字符串,请按升序排列其所有字母。 输入:输入的第一行包含T,表示测试用例的数量。然后是每个测试用例的描述。测试用例的第一行包含表示字符串长度的正整数N。第二行包含字符串。 输出:对于每个测试用例,输出排序后的字符串。 约束条件: 对于输入: 输出: 预期输出: