【问题标题】:Take string length and reverse in 8086 emulator在 8086 模拟器中取字符串长度和反向
【发布时间】:2021-11-10 11:11:54
【问题描述】:

谁能帮我把这个字符串倒过来?

这是我的代码

include 'emu8086.inc'    

 PRINTN 'Enter length of string'
 mov ah,1h
 int 21h

 printn                 
 
 print "Enter String here: "
 mov cl,al
 sub cl,'0'         
 mov dl,cl           
 mov bx,0
 
 
 p1:  
 
 mov ah,1h
 int 21h             
 
 mov [bx],ax        
 inc bx             
 dec cl
 cmp cl,0           
 jne p1       
 
 
 printn
 PRINT 'inputted string : '
 
 mov cl,dl
 mov bx,0

 output:
 mov dl,[bx]
 
 mov ah,2h
 int 21h    
 
 inc bx   
 dec cl
 cmp cl,0  
 jne output
 printn     
 
 mov ax, 4c00h  
 int 21h

ret

【问题讨论】:

  • 从末端向后循环而不是向前循环。你已经在倒计时cl,也倒计时bx。在存储输入的最后一个字节后,bx 已经指向缓冲区的末尾,因此如果您在循环之间保持 bx 未修改,则您已经有一个指向末尾的指针。

标签: string assembly reverse x86-16 emu8086


【解决方案1】:
  • 您将字符串存储在地址 0 (mov bx, 0)。根据您创建的程序类型,这可能会覆盖重要数据。在下面的示例程序中,我选择了 .COM 格式,您不必担心设置段寄存器。他们都是平等的。
  • 当你存储一个字符串字符(mov [bx],ax)时,你应该使用AL。该字符仅在AL 寄存器中。
  • 在序列dec clcmp cl,0jne p1 中,cmp cl, 0 是多余的,因为dec cl 指令已经提供了零测试标志ZF。并且知道这是一个带有 DOS 系统调用的输入循环,所以无论如何它很慢,您可以使用 loop p1。
  • 消息“输入的字符串:”并不能真正反映您所做的事情,是吗?也许写一些类似'reversed string:'的东西?
  • 就像@Peter Cordes 在评论中告诉你的那样,在 p1 输入循环的末尾,BX 寄存器指向字符串的最后一个字符。重复使用它,但以预先递减的方式进行。这与您在输入循环中使用的后递增方式相反。
  • 输出循环也可以使用较小的 loop p2 指令,因为速度方面的瓶颈是 DOS 系统调用,无论如何它都很慢。
#make_COM#
include 'emu8086.inc'
ORG 100h

  PRINTN 'Enter length of string'
  mov  ah, 01h
  int  21h                  ; -> AL = "0" to "9"
  sub  al, '0'
  mov  dl, al
  mov  dh, 0                ; -> DX = 0 to 9
  printn

  print "Enter String here: "
  mov  bx, OFFSET Buffer
  mov  cx, dx
p1:  
  mov  ah, 01h
  int  21h
  mov  [bx], al
  inc  bx                   ; "post-increment"
  loop p1
  printn

  PRINT 'reversed string : '
  mov  cx, dx
p2:
  dec  bx                   ; "pre-decrement"
  mov  dl, [bx]
  mov  ah, 02h
  int  21h    
  loop p2
  printn

  mov ax, 4C00h
  int 21h

Buffer db 10 dup(0)

【讨论】:

    猜你喜欢
    • 2016-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多