String 在部件中重新排序编号
我在做一个程序,你可以像这样改变数字。 你输入这个数字。123456789 输出将是:String 在部件中重新排序编号,string,sorting,assembly,numbers,String,Sorting,Assembly,Numbers,我在做一个程序,你可以像这样改变数字。 你输入这个数字。123456789 输出将是: 123456789 234567891 345678912 456789123 567891234 678912345 789123456 891234567 912345678 但是我做不到,我试着把数字当作一个字符串,像这样把它们颠倒过来 model small stack 100 dataseg cadena db '123456789','$' long_cadena dw $-cad
123456789
234567891
345678912
456789123
567891234
678912345
789123456
891234567
912345678
但是我做不到,我试着把数字当作一个字符串,像这样把它们颠倒过来
model small
stack 100
dataseg
cadena db '123456789','$'
long_cadena dw $-cadena ;leght string
cadena_rev db 9 dup(' ')
Espacio db 13,10,' ','$'
Codeseg
start:
mov ax,@data
mov ds,ax
mov es,ax
mov cx,long_cadena
add cx,-2
lea si,cadena
lea di,cadena_rev
mov di,0
mov si,9
add si,long_cadena
add si,-2
L1:
mov al,[di];muevo
mov ah,09h
lea dx,cadena_rev
int 21h
mov [si],al
;inc si
;dec di
dec si
inc di
mov ah,09h
lea dx,cadena
int 21h
loop L1
mov ah,09h
lea dx,Espacio
int 21h
Exit:
mov ax,4c00h
int 21h
end start
您已经有一个循环来显示字符串,现在需要一个内部循环来将字符串向左旋转一个位置:
.model small
.stack 100h
.data
cadena db '123456789','$'
Espacio db 13,10,'$'
.code
start:
mov ax,@data
mov ds,ax
mov cx,9 ;◄■■ MAIN COUNTER.
L1:
mov ah,09h
lea dx,cadena
int 21h ;◄■■ DISPLAY CADENA.
mov ah,09h
lea dx,Espacio ;◄■■ LINE BREAK.
int 21h
;ROTATE LEFT.
mov bx,8 ;◄■■ INNER LOOP COUNTER.
lea si,cadena
mov ah,[si] ;◄■■ PRESERVE LEFT MOST CHAR.
L2:
mov al,[si+1] ;◄■■ MOVE CURRENT CHAR + 1
mov [si],al ; ONE POSITION TO THE LEFT.
inc si ;◄■■ NEXT CHAR.
dec bx ;◄■■ DECREASE INNER COUNTER.
jnz L2 ;◄■■ IF INNER COUNTER IS NOT ZERO.
mov [si],ah ;◄■■ LEFT MOST CHAR GOES TO RIGHT.
loop L1
Exit:
mov ax,4c00h
int 21h
end start
这段代码做了你不想做的事情,比如在调试器中观察你做
leadi,cadena_rev
mov di,0
时会发生什么。。。然后只选一个(你需要的)。此外,不需要反转字符串。对于i=[1,9]
,需要“旋转”它,即string\u i=original.substring(i)+original.substring(1,i-1)
,从1开始索引(子字符串(1,0)返回空字符串)。如果您了解这种“高级”算法,请检查如何在汇编程序中编译字符串,以及创建“子字符串”意味着什么,调整汇编(0的偏移量更容易),为此创建过程,……同时通过短代码段一直对其进行调试,看看它是否像预期的那样工作,寄存器/内存中的结果是否正确。谢谢你花时间回答我,我是汇编新手,这是我汇编课的考试,我不太理解算法:(还有其他帮助吗?每个“旋转”将需要执行以下操作:保存第一个元素。将第二个元素移到第一个,第三个元素移到第二个,第四个元素移到第三个(8次,最好在一个循环中完成)。然后将保存的元素移到第九个元素所在的位置。非常感谢你,伙计!你真的帮助了我!谢谢你!
.model small
.stack 100h
.data
cadena db '123456789','$'
Espacio db 13,10,'$'
.code
start:
mov ax,@data
mov ds,ax
mov cx,9 ;◄■■ MAIN COUNTER.
L1:
mov ah,09h
lea dx,cadena
int 21h ;◄■■ DISPLAY CADENA.
mov ah,09h
lea dx,Espacio ;◄■■ LINE BREAK.
int 21h
;ROTATE LEFT.
mov bx,8 ;◄■■ INNER LOOP COUNTER.
lea si,cadena
mov ah,[si] ;◄■■ PRESERVE LEFT MOST CHAR.
L2:
mov al,[si+1] ;◄■■ MOVE CURRENT CHAR + 1
mov [si],al ; ONE POSITION TO THE LEFT.
inc si ;◄■■ NEXT CHAR.
dec bx ;◄■■ DECREASE INNER COUNTER.
jnz L2 ;◄■■ IF INNER COUNTER IS NOT ZERO.
mov [si],ah ;◄■■ LEFT MOST CHAR GOES TO RIGHT.
loop L1
Exit:
mov ax,4c00h
int 21h
end start