加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

数组 – 将LinkedList与String Reversal组合为目标是理解LinkedL

发布时间:2020-12-14 16:38:08 所属栏目:Java 来源:网络整理
导读:我试图使用一个链接列表程序来显示用户输入的反向字符串.以下是我的程序来反转用户输入的字符串.它还给出了字符串的长度: TITLE ReadStringProc (ReadStringProc.asm)include irvine32.incListNode STRUCT NodeData DWORD ? NextPtr DWORD ? ListNode ENDS
我试图使用一个链接列表程序来显示用户输入的反向字符串.以下是我的程序来反转用户输入的字符串.它还给出了字符串的长度:
TITLE ReadStringProc (ReadStringProc.asm)

include irvine32.inc

ListNode STRUCT 
    NodeData DWORD ?
    NextPtr DWORD ? 
ListNode ENDS 

NULL = 0
Counter = 0

.data
input               byte        100 dup(0)                         
stringinput         byte        "Enter any string: ",0         
totallength         byte        "The total length is: ",0   
reverse             byte        "The reverse string is: ",0

LinkedList LABEL DWORD
REPT input
    Counter = Counter + 1
    ListNode <Counter,($+ Counter * SIZEOF ListNode)>
ENDM
ListNode <0,0>  ; tail node




.code 




stringLength        proc
                    push        ebp
                    mov         ebp,esp
                    push        ebx
                    push        ecx
                    mov         eax,0
                    mov         ebx,[ebp+8]
L1:
                    mov         ecx,[ebx] ;you can use ecx,cx,ch,cl 
                    cmp         ecx,0     ;you can use ecx,cl 
                    JE          L2
                    add         ebx,1
                    add         eax,1
                    jmp         L1
L2:
                    pop         ecx
                    pop         ebx
                    mov         ebp,esp
                    pop         ebp
                    ret         4

stringLength        endp

swap MACRO          first,last
                    push        eax 
                    mov         ah,first
                    mov         al,last
                    xor         al,ah ;x
                    xor         ah,al ;y 
                    xor         al,ah ;x
                    mov         last,al
                    mov         first,ah
                    pop         eax
endM

stringReverse proc 
                    push        ebp
                    mov         ebp,esp
                    push        OFFSET input  
                    call        stringLength
                    mov         edx,[ebp+8]   ;edx = offset string to reverse 
                    mov         esi,offset 0
                    dec         eax    
                    mov         ebx,edx       ;ebx stores the pointer to the first character  
                    add         ebx,eax       ;now ebx store the pointer to the last character before the '$'  
                    reverseloop:   
                    push        edx 
                    push        ebx 
                    swap        [edx],[ebx]
                    inc         edx          ;increment  of the right-most pointer
                    dec         ebx          ;decrement of the right-most pointer 
                    cmp         edx,ebx     ;compares the left-most pointer to the right-most 
                    jb          reverseloop
jmp stopEnd      ;"ja",there is no need to check a condition twice 

stopEnd:
                    mov         esp,ebp
                    pop         ebp
ret 4

stringReverse       endp

main proc

                    call        clrscr              
                    mov         edx,offset stringinput     
                    call        writeString
                    mov         edx,offset input 
                    call        writeString      
                    call        stringLength
                    mov         edx,offset input 
                    mov         ecx,sizeof input 
                    call        readstring        
                    call        crlf
                    mov         edx,offset totallength
                    call        writestring
                    call        writedec    
                    call        crlf
                    mov         edx,offset reverse
                    call        crlf
                    call        writeString
                    push        offset input
                    call        stringReverse
                    mov         edx,offset input 
                    call        writeString     
                    call        crlf

                    exit 
main                endp


                    end         main

我的目标是找到一种方法来使用在Kip Irvine的Assembly x86书中找到的这段代码,并将其与我所使用的代码结合起来,以便我可以使用链接列表来显示反向字符串:

ListNode STRUCT
  NodeData DWORD ?
  NextPtr  DWORD ?
ListNode ENDS

TotalNodeCount = 15
NULL = 0
Counter = 0

.data
LinkedList LABEL DWORD
REPT TotalNodeCount
    Counter = Counter + 1
    ListNode <Counter,0>  ; tail node

.code
main PROC
    mov  esi,OFFSET LinkedList

; Display the integers in the NodeData members.
NextNode:
    ; Check for the tail node.
    mov  eax,(ListNode PTR [esi]).NextPtr
    cmp  eax,NULL
    je   quit

    ; Display the node data.
    mov  eax,(ListNode PTR [esi]).NodeData
    call WriteDec
    call Crlf

    ; Get pointer to next node.
    mov  esi,(ListNode PTR [esi]).NextPtr
    jmp  NextNode

quit:
    exit

有人可以指导我走正确的道路.谢谢.

解决方法

您不需要链接列表来反转字符串.不,认真

但是,如果你坚持…

stringReverse proc;     <-- Warning: EBX and ESI are not preserved!
  push ebp;
  mov ebp,esp;
  mov ebx,[ebp + 8];   <-- EBX = target string pointer
  push ebx;
  call stringLength;    <-- we trust that stringLength() preserves EBX
;  mov ebx,[ebp + 8];   <-- uncomment this if it actually does not
  mov esi,ebx;
  xor edx,edx;
  add ebx,eax;
  neg eax;

  @fill:
    mov cl,[ebx + eax];
    sub esp,8;         <-- allocating a new linked list item on stack
    mov [esp],cl;      <-- 1st DWORD / 1st BYTE = current character
    mov [esp + 4],edx; <-- 2nd DWORD = next item pointer
    mov edx,esp;       <-- EDX = current item pointer
    inc eax;
  jne @fill;

  @roll:
    mov cl,[edx];
    mov [esi],cl;
    inc esi;
    mov edx,[edx + 4]; <-- next item,here we go!
    test edx,edx;      <-- what if we are done?
  jne @roll;

  mov esp,ebp;         <-- discarding the allocated stack
  pop ebp;
  ret 4;

这样的东西

它应该工作,但我没有真正测试.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读