2013-04-18 114 views
0

我有一个项目,我想输入一个数字,说我进入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 

现在我只需要另一边。

+0

我在这里看不到任何代码,所以我认为你是完全新装配。你可能想从一个简单的hello世界程序开始。 “...使用阵列”意味着什么?一个字符串是一个数组,对吗?无论如何,在汇编中它只是一块内存,除非你把你的字符串放入一个或多个寄存器。 – nrz 2013-04-18 07:51:15

回答

1

欢迎来到最黑暗的黑色电脑艺术 - 汇编!

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

你有一个数字,让我们说BL(因为这是一个很好的汇编名称),你想要做的是产生BL线的输出。假设BL = 5

现在,CX作为计数器寄存器非常好,所以如果我们将BL复制到CL并通过将它与自身异或来清除CH,我们也有CX =#行。

我们必须扭转之前打印的字符数为方便比这个多,所以我们可以增加CX - 这是一个重要的数字,所以它保存在说,BP

每行由字母'Z'降至('Z' - BH + 1),另一个星号,然后相同,并换行。并且每一行都会减少一个打印的字母数,并将一个星号加上一个星号。

为了生产一条线,我们最好

  • 负载寄存器 - 比如说,DL,而 'Z'(DL因为它的方便, 输出一个 'printme' 例程)
  • 复制那么到另一个寄存器,比如说BH(寄存器到寄存器的移动速度是 快,比负载立即小)
  • 从BH减去BL,产生一个魔术值,'Z' - 5 ='U' - 是有 钟声响了吗?

我们想打印一个字母数,所以如果我们将BP复制到CX中,那应该是有用的。
下面是我们想要做的CX时代的东西:

  • 写出来的字在DL - 与一捻。
  • 变化通过减小在DL字符它

然后,我们需要输出另一个BP字节,所以sopy BP以CX再次
下面是我们想要做的CX时代的东西:

  • 写DL中的角色 - 扭曲。
  • 变化通过递增

然后发送CR和LF

所以在DL性格 - 有什么扭曲?

那么,如果在DL字符小于或等于BH的性格,我们要与Asterisk如果DL在堆栈上替换一个星号,所以

  • 保存DX
  • 负载DL < = BH
  • 输出DL
  • 将DX从堆栈中弹回,恢复其值,然后我们用 替换星号。

完成该行 - 递减BL中的行数;如果结果不为零,则生成另一行

  • 如果它为零,我们都完成了。

这里需要注意的是,通过递减BL中的行数,从生产线程序开始时的DL减去的数量递减,所以'改变为aster'值变为'V',' W'...

现在让我们彻底纠结。

你会注意到,这两个写CX-字符程序之间的唯一区别是,一个递减和其他增量DL ...

让我们设置SI到0FFFFH,DI 1我们开始之前,只为一笑。

现在 - DH正在为整场比赛坐在板凳上。

假设我们编写例程以打印CX字符,以便将SI添加到DX。这将给我们第一次在循环中需要的减量。

  • 当循环结束时,假设我们有EXCHANGE DI和SI。
  • 循环运行的下一次,它将INCREMENT DX,然后再次交换SI 和DI。

很有用,呵呵?

哦,当我们扭曲时,我们可以通过使用它来存储DL而不是推动DX并将其弹回来,从而让DH参与其中。将DL移到DH,测试替换aster,写出并从DH恢复DL。

所以 - 这个套路的一点是,它不依赖于存储串...

0

我写了一篇关于如何创建一个pyramid of characters的教程。它使用NASM和Windows API而不是Irvine,但该教程应该能够帮助你在物流方面有所帮助。