Assembly 如何在程序集中反转和修改字符串?

Assembly 如何在程序集中反转和修改字符串?,assembly,masm,irvine32,Assembly,Masm,Irvine32,我有一个项目,我想输入一个数字,然后说我输入3,它会给你一个输出 ZYX**XYZ ZY****YZ Z******Z 5分可以给你 ZYXWV**VWXYZ ZYXW****WXYZ ZYX******XYZ ZY********YZ Z**********Z 在我的项目中,我认为我的导师不会允许我使用数组,或者至少现在还不会,但这是我的想法 我想用一个字符串来表示这个数字,比如说我得到了一个3。我将生成ZYX*并简单地反转它,得到三角形的另一半。唯一的问题是,我不知道如何把字

我有一个项目,我想输入一个数字,然后说我输入3,它会给你一个输出

ZYX**XYZ

ZY****YZ

Z******Z
5分可以给你

ZYXWV**VWXYZ

ZYXW****WXYZ

ZYX******XYZ

ZY********YZ

Z**********Z
在我的项目中,我认为我的导师不会允许我使用数组,或者至少现在还不会,但这是我的想法

我想用一个字符串来表示这个数字,比如说我得到了一个3。我将生成ZYX*并简单地反转它,得到三角形的另一半。唯一的问题是,我不知道如何把字母一个一个地改成星星。我正在考虑使用循环来实现它,但不确定如何实现。我只知道下一个字符串是ZY**然后简单地反转它

别误会我的意思,我并不是要求你们都为我做这件事,但也许可以给我一些关于如何去做的建议。多谢各位

到目前为止,感谢你们,我已经能够想出这个

TITLE MASM Template                     (main.asm)

; Description:
; 
; Revision date:

INCLUDE Irvine32.inc

.data
x       DWORD   ?
msg     BYTE    "Please input a number: " ,0dh,0ah,0

.code
;crlf
main PROC
    call    Clrscr

    MOV     edx, OFFSET msg         ; Moves message to input number into register
    call    WriteString         ; Displays message on screen to prompt user to input number
    call    readInt             ; Take the number that the user inputs
    MOV     x,eax                   ; Store it into x
    MOV     ecx, eax                ; For the loop counter  
    MOV     al, 'Z'                 ; Move Z to the register

L2:
    MOV     al, 'Z'             ; Resets al to z for loop

L1:                         ; Start of the loop with label L1
    call    WriteChar           ; To write the letters
    ;call crlf              ; To put in 'enter'
    SUB     al, 1               ; To Move the next char going downward
    LOOP    L1

    MOV     al, ' '
    call    WriteChar
    MOV     ecx, x                  ; Resets ecx for outside loop
    SUB     x, 1                    ; Decrements x for counter

    call    crlf                    ; To be tidy    
    LOOP    L2

    exit
main ENDP
END main

现在我只需要另一面。

欢迎来到最黑暗的计算机艺术-汇编程序

让我们从汇编程序员的角度来看这个问题

你有一个数字,比如BL('因为这是一个很好的汇编语言名称),你要做的是生成BL行输出。假设BL=5

现在,CX作为计数器寄存器非常好,所以如果我们将BL复制到CL,并通过对其自身进行XOR来清除CH,那么我们也有CX=#行

在反转之前我们必须打印的字符数比这个要多一个,所以我们可以增加CX,这是一个重要的数字,所以把它保存在比如说BP中

每一行由字母“Z”到('Z'-BH+1)和一个星号组成,然后是相同的反方向和一个新行。每增加一行,你就减少一个字母的打印数量,并增加一个星号

要生产一条生产线,我们需要

  • 加载一个寄存器,比如说,DL,加上“Z”(DL),因为这样做很方便 “printme”例程的输出)
  • 将其复制到另一个寄存器,例如BH(寄存器移动的寄存器是 比负载更快、更小(即时)
  • 从BH中减去BL,得到一个神奇的值,'Z'-5='U'-存在吗 铃响了吗
我们要打印一个字母计数,因此如果我们将BP复制到CX中,这应该很有用。
以下是我们想要做的事情:

  • 用DL-写出这个角色,并加上一个转折
  • 通过递减更改DL中的字符
然后我们需要输出另一个BP字节,以便再次将BP发送到CX
以下是我们想要做的事情:

  • 用DL-写出这个角色,并加上一个转折
  • 通过递增更改DL中的字符
然后发送CR和LF

那么,有什么问题

如果DL中的字符小于或等于BH中的字符,我们想用星号代替,所以

  • 在堆栈上保存DX

  • 加载带有星号的DL,如果DL我写了一篇关于如何创建数据库的教程。它使用NASM和Windows API而不是Irvine,但本教程应该会让您开始学习,并在后勤方面为您提供一些帮助。

    我在这里没有看到任何代码,因此我认为您对汇编绝对是新手。您可能希望从一个简单的hello world程序开始。“使用数组”是什么意思。字符串是数组,对吗?无论如何,在汇编中,它在任何情况下都只是一块内存,除非您将字符串放入一个或多个寄存器中。