@Alertoso

Почему не обнуляется регистр cx?

org 100h

Start:

        mov     ah, 0ah
        mov     dx, firstNum
        int     21h

        mov     ah, 02h
        mov     dx, 10
        int     21h

        mov     bx, firstNum
        call    A1

        mov     ah, $08
        int     21h
        mov     ax, 4c00h               ;выход
        int     21h


A1:
        push    ax
        push    cx
        push    dx
        push    di
        xor     cx, cx

        mov     di, 10
        mov     cx, [bx+2]
        mov     si, 2

.A2:
        xor     dx, dx
        mov     dx, [bx+si]
        sub     dx, '0'
        add     ax, dx
        mul     di
        inc     si
        loop    .A2

        pop     si
        pop     di

        call    Show_AX

Show_AX:
        push    ax
        push    cx
        push    dx
        push    di

        mov     di, 10                  ;di - основание с/c(системы счисления)
        xor     cx, cx                  ;cx - количество цифр в числе
 
@@Conv:
        xor     dx, dx
        div     di                      ;dl = num mod 10
        add     dl, '0'                 ;перевод в символьный формат
        inc     cx
        push    dx                      ;складываем в стeк
        or      ax, ax
        jnz     @@Conv

;вывод из стека на экран

@@Show:
        pop     dx                      ;dl = очередной символ
        mov     ah, $02                 ;ah - функция вывода символа на экран
        int     21h

        loop    @@Show
 
        pop     di
        pop     dx
        pop     cx
        pop     ax

        mov     ah, $08
        int     21h
        mov     ax, 4c00h               ;выход
        int     21h

firstNum        dw 6,0,5 dup(?)
  • Вопрос задан
  • 89 просмотров
Пригласить эксперта
Ответы на вопрос 1
jcmvbkbc
@jcmvbkbc
http://dilbert.com/strip/1998-08-24
Почему не обнуляется регистр cx?

Сдаётся мне, ты совсем другой вопрос хочешь задать. Например, "почему подпрограмма A1 перевода строки в её числовое значение работает неправильно". Ответ на этот вопрос: потому что в следующем коде есть две ошибки:

A1:
        push    ax
        push    cx
        push    dx
        push    di
        xor     cx, cx

        mov     di, 10
        mov     cx, [bx+2]

- во-превых длина строки записана по смещению 1 в буфере, который заполняет функция 0ah прерывания 21h,
- во-вторых, длина строки представлена одним байтом, а не словом, как ты читаешь.
С учётом этого, код должен выглядеть вот так:
A1:
        push    ax
        push    cx
        push    dx
        push    di
        xor     cx, cx

        mov     di, 10
        mov     cl, [bx+1]

А буфер для ввода строки должен быть определён так:
firstNum db 6,0,6 dup(?)

Дальше, вот тут ты опять путаешь байты со словами и загружаешь в dx больше чем надо:
.A2:
        xor     dx, dx
        mov     dx, [bx+si]
        sub     dx, '0'
        add     ax, dx

должно быть
.A2:
        xor     dx, dx
        mov     dl, [bx+si]
        sub     dl, '0'
        add     ax, dx


Дальше у тебя какая-то ерунда с балансом стека:
A1:
        push    ax
        push    cx
        push    dx
        push    di
...
        pop     si
        pop     di

ты кладёшь в него одно, а снимаешь другое и в другом количестве. Но это не важно, потому что из функции A1 ты всё равно нигде не возвращаешься. Show_AX выглядит нормально.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы