String 在部件中重新排序编号

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 输出将是:

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