2017-01-19 17 views
-3

я должен сделать программу в TASM, которые должны напечатать треугольник чисел, как это:печать треугольник чисел в сборке x86

input: n. Ex: n=4 

output: 

1 
1 2 
1 2 3 
1 2 3 4 

я сумел сделать мою программу напечатать эту вещь, но я также необходимо заставить его работать с номерами от 0 до 255, а не только для цифр.

Я знаю, что я должен прочитать номер по одной цифре и создать сумму, как это:

, если я должен читать 82, я прочитал во-первых, 8, положить его в регистр, а затем, когда я прочитайте 2, он должен быть добавлен к 8 * 10.

Можете ли вы помочь мне реализовать это в моей программе?

.model small 
.stack 100h 

.data 
    msg db "Enter the desired value: $", 10, 13 
    nr db ? 

.code 
    mov AX, @data 
    mov DS, AX 

    mov dl, 10 
    mov ah, 02h 
    int 21h 
    mov dl, 13 
    mov ah, 02h 
    int 21h 

    mov DX, OFFSET msg 
    mov AH, 9 
    int 21h 
    xor ax, ax 

    mov ah, 08h     ;citire prima cifra din numar 
    int 21h 


    mov ah, 02h 
    mov dl, al 
    int 21h 

sub al,30h 
    mov ah,10 
    mul ah     

    mov [nr],al   ;mutam prima cifra inmultita cu 10 in nr 

    mov ah, 08h 
    int 21h 



    mov ah, 02h   
    mov dl, al 
    int 21h 

    sub al, 30h   
    add [nr], al 


    sub nr,30h 

    mov dl, 10 
    mov ah, 02h 
    int 21h 
    mov dl, 13 
    mov ah, 02h 
    int 21h 

    mov cx,1 

    mov bx,31h 
    mov ah, 2 
    mov dx, bx 
    int 21h 

loop1: 
    xor ax, ax 
    mov al, nr 
    cmp ax, cx 
    je final 

    mov dl, 10 
    mov ah, 02h 
    int 21h 
    mov dl, 13 
    mov ah, 02h 
    int 21h 

    mov bx, 0    

loop2: 
    inc bx    
    add bx,30h 
    mov ah, 2 
    mov dx, bx 
    int 21h 
    sub bx,30h 
    cmp bx, cx   
    jne loop2 

    inc bx    
    add bx,30h 
    mov ah, 2 
    mov dx, bx 
    int 21h 

    inc cx 
    jmp loop1 

final: 
    mov AH,4Ch ; Function to exit 
    mov AL,00 ; Return 00 
    int 21h 

end 
+0

вы знаете, что вам нужно делать 'x * 10 + y', что вызывает у вас проблемы? Вы не можете это сделать? Это тривиально, но и множество примеров для него даже здесь, на SO. – Jester

+0

Поскольку вы будете делать много преобразований number-> ascii, вы можете рассмотреть возможность оптимизации. Рисуем первую целую последнюю строку в буфере памяти, затем исправляя ее для каждой строки, чтобы отображать только необходимое количество чисел, и просто печатать только буфер, не делая больше математики чисел. На самом деле можно создать этот начальный отпечаток последней строки, даже не работая с числами, просто исправляя строки ASCII. – Ped7g

+0

Я редактировал мой код выше. Мне удалось прочитать двухзначное число, но теперь я не знаю, как их печатать. Этот код печатает все символы ASCII, и я не вижу логики. –

ответ

2

вы на полпути.

«если я должен читать 82, я прочитал во-первых 8, поместить его в регистр, а затем, когда я прочитал 2, он должен быть добавлен к 8 * 10»

для каждой цифры вы читаете в , вы должны умножить предыдущее значение на 10. не только для 2-го, а также для 3-го (и вы можете сделать это для первого, так как считанное значение было 0)

что остается:

result = 0 
    while (more digits to come) 
     result *= 10; 
     result += value of current digit 

это,
82 будет ((0 * 10 + 8) + 2) = 82
251 будет (((0 * 10 + 2) * 10 + 5) * 10 +1 = 251

же с выводом своего номера в цикле, для значений> 9, вы не можете просто добавить ' 0 'и напечатать значение ascii, вы должны закодировать его как строку ascii и отобразить всю строку (как вы уже делали с INT 21H/09H)

Также сделайте себе одолжение и разделите эти проблемы. Напишите подфункции «decode_bin» и «encode_bin» и замените INT в вашем цикле на вызовы этих функций, иначе вы не сможете прочитать их через 2 недели или около того :-)