Как я могу отменить и изменить свою строку в сборке?

У меня есть проект, в котором я хочу ввести число и сказать, что я ввожу 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

Теперь мне просто нужна другая сторона.


person Marlin Hankin    schedule 18.04.2013    source источник
comment
Я не вижу здесь кода, поэтому я предполагаю, что вы абсолютно новичок в ассемблере. Вы можете начать с простой программы hello world. Что вы имеете в виду под... использовать массив. Строка — это массив, верно? В любом случае, в ассемблере это просто блок памяти в любом случае, если вы не вписываете свою строку в один или несколько регистров.   -  person nrz    schedule 18.04.2013


Ответы (2)


Добро пожаловать в самое черное из черных компьютерных искусств - Ассемблер!

Давайте посмотрим на эту проблему с точки зрения программиста на ассемблере.

У вас есть число, скажем, BL (потому что это хорошее имя на ассемблере), и вы хотите получить BL-строки вывода. Допустим, БЛ=5.

Теперь CX действительно хорош в качестве регистра-счетчика, поэтому, если мы скопируем BL в CL и очистим CH с помощью операции XOR с самим собой, мы также получим строки CX=#.

Количество символов, которые мы должны напечатать перед реверсированием, удобно на один больше, чем это, поэтому мы могли бы увеличить CX — и это важное число, поэтому сохраните его, скажем, в BP.

Каждая строка состоит из букв от 'Z' до ('Z' - BH + 1) и одной звездочки, затем то же самое в обратном порядке и новая строка. И с каждой новой строкой вы уменьшаете количество напечатанных букв на одну и добавляете единицу к количеству звездочек.

Чтобы создать одну строку, мы бы

  • Загрузить регистр — скажем, DL, с помощью «Z» (DL, потому что это удобно в качестве вывода для процедуры «printme»)
  • Скопируйте это в другой регистр, скажем, BH (перемещение между регистрами быстрее и меньше, чем немедленная загрузка)
  • Вычтите BL из BH, получив магическое значение: 'Z' - 5 = 'U' - уже звенит звонок?

Мы хотим напечатать количество писем, поэтому, если мы скопируем BP в CX, это должно быть полезно.
Вот что мы хотим сделать в CX раз:

  • Выписать персонажа в DL — с изюминкой.
  • Измените символ в DL, УМЕНЬШИВ его

Затем нам нужно вывести еще один байт BP, так что снова скопируйте BP в CX
Вот что мы хотим сделать CX раз:

  • Выписать персонажа в DL — с изюминкой.
  • Измените символ в DL, УВЕЛИЧИВ его

Затем отправьте CR и LF

Итак - в чем подвох?

Итак, если символ в DL МЕНЬШЕ или РАВЕН символу в BH, мы хотим заменить звездочку, поэтому

  • сохранить DX в стеке
  • загрузить DL со звездочкой, если DL‹=BH
  • выходной DL
  • вытолкнуть DX обратно из стека, восстановив его значение до того, как мы заменили звездочку.

Сделано эту строку - уменьшить количество строк в BL; если результат отличен от нуля, создайте другую строку

  • Если это ноль, мы все сделали.

Обратите внимание, что при уменьшении количества строк в BL число, вычитаемое из DL в начале процедуры создания строки, уменьшается, поэтому значение «изменить на aster» становится «V», «W»...

Теперь давайте прямо пошалим.

Вы заметите, что единственная разница между двумя подпрограммами записи CX-символов заключается в том, что одна DECREMENTS, а другая INCREMENTS DL...

Давайте установим SI в 0FFFFH и DI в 1, прежде чем мы начнем, просто для смеха.

Теперь - DH сидит на скамейке запасных всю эту игру.

Предположим, мы напишем процедуру для печати символов CX таким образом, чтобы она добавляла SI к DX. Это даст нам декремент, который нам нужен в цикле в первый раз.

  • Когда цикл закончится, предположим, что мы ОБМЕНЯЕМСЯ DI и SI.
  • В следующий раз, когда цикл запустится, он УВЕЛИЧИТ DX, а затем снова поменяет местами SI и DI.

Полезно, да?

О, и пока мы крутим, мы можем задействовать DH, используя его для хранения DL, а не подталкивая DX и выталкивая его обратно. Переместить DL в DH, проверить на подмену астер, выписать и восстановить DL из DH.

Итак, смысл этой процедуры в том, что она не полагается на строку в хранилище...

person Magoo    schedule 18.04.2013

Я написал руководство о том, как создать пирамида символов. Он использует NASM и Windows API вместо Irvine, но руководство должно помочь вам начать работу и немного помочь вам в логистике.

person Gunner    schedule 19.04.2013