моя программа только работает в отладчике - PullRequest
0 голосов
/ 23 января 2019

Я не могу понять, почему моя программа не работает

в моей процедуре я собираюсь взять переменное число, процесс это и положить его на сегмент данных, то я хочу, чтобы отобразить это число, используя функцию ах, 02h, но проблема в том, что он не показывает правильное содержание в сегменте данных. вот у меня 18 44 в сегменте данных я декомпилирую

mov si,offset result если si сейчас указывает на 18, я использую:

mov al,byte ptr[si] ; now al have 18

xor ah,ah

aam ; now ax is 0204

add ah,30h ; to change to hex

add al,30h

теперь топор 3234, теперь я буду двигаться ax to bx and display it

mov bx,ax

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

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

теперь должно выдаваться 24, но я получаю ошибку при отображении

также я использую инструкцию je для цикла левый номер

inc si

я беру 44

aam

0608 = ах

add ah,30h add al,30h

ax = 3638 mov снова в bx

когда я отображаю с помощью ах, 02h int 21 это должно дать 68

Вообще, это должно дать 2468, но теперь оно не дает этого значения

в моем основном процессе я использовал

mov ax,@data

mov ds,ax

mov es,ax

mov ss,ax

я также сделал модель программы большой и маленькой, но без изменений в программе 300 строк, если я сделаю переменную 2 вместо 2468 (1844) он печатает 31, если я делаю две цифры, например, 11, он печатает 3232, если это 1234, он делает 313131. в bx число установлено успешно ошибка во время отображения но если я переместлю конкретное число в bx, оно будет работать в одиночку.

я открываю отладку и в bx номер настроен правильно, если в bx значение равно 32, то должно быть 2 все то же самое. если цифра увеличивается, то увеличивается с

2 32 1 32

3 32

11 3232

111 323232 выглядит так

вот код и фото; td is showing correct result

aam

add ah,30h

add al,30h

xor bx,bx xor dx, dx mov bx,ax mov dl, bh`

mov ah,02h

int 21h

mov dl,bl

mov ah,02h

int 21h

inc si

jmp .display

td

вот мое фото при работе в отладчике correct resu;t in td debug but not work when run outside debug

Вот полный код

.model large

 .stack 4096

    .data

    msg1 db 10,13,'------>$'

    msg2 db 10,13,'------->$'

    first_n db 13

                 db ?

                 db 10,13, 13 dup(' ')    

    sec_n db 13

                db ?

                db 10,13, 13 dup (' ')

               total_sp db ?

    carry db ?

    result db ?

         db 7 dup(' ')

    resultm db 10,13,"the sum is: $"

    printable db 13 dup (' ')

    .code

    main proc

    mov ax,@data

    mov ds,ax

    mov es,ax

    mov ss,ax

    mov dx,offset msg1

    mov ah,09h

    int 21h

    mov dx,offset first_n

    mov ah,0ah

    int 21h

    mov dx,offset msg2

    mov ah,09h

    int 21h

    mov dx,offset sec_n

    mov ah,0ah

    int 21h


    ;___________________________________________________
    mov bx,1

    mov al,byte ptr [first_n+bx]

    mov ah,byte ptr[sec_n+bx]

    jmp which_great

    take_1:

    mov total_sp,al

    jmp .start

    which_great:

    cmp al,ah
    jge take_1
    mov total_sp,ah
    ;____________________________________________

    .start:
    xor ax,ax
    xor bx,bx
    xor dx,dx

    mov al,total_sp
    mov bx,2
    div bx
    jmp paritychek

    add_sp:
    cmp al,0
    je     dontadd
    jmp   add1
    dontadd:
    mov al,1
    jmp endpchek

    add1:
    add al,1
    jmp endpchek

    paritychek:

    cmp dx,0
    jne add_sp       ; if it is odd add  1 to the result ,for space reserve

    endpchek:
    mov result,al

    xor dx,dx
    xor ax,ax
    xor bx,bx

    ;------------------------------------------------------------------------------
    ; the next procedure take a inserted string for 
    ; first number use si and for second used bx to 
    ; access data segment puts numbers in al and dl
    ; add them together and store. 
    ; carry byte is putted in a carry for next byte
    ;------------ - - - - - - - ------------------------ - - - - - - - -------------------

    begin1:
    mov si,offset first_n
    inc si              ;point to a number intered by user

    xor cx,cx           ;clear everything from cx
    mov cl,[si]             ;move  digits enter by user to cl
    add si,cx          ;add a digit enterd by user to itself now si point
                                 ;to last digit  



    theres1st:           
    xor ax,ax  
    cmp si,offset first_n+1
    je nodigit
    mov al,byte ptr[si]
    dec si
    cmp si ,offset first_n+1
    je  nodigit

    theres2nd:
    mov ah,byte ptr[si]
    sub al,30h
    sub ah,30h
    aad
    dec si
    xor cx,cx
    jmp num2test

    nodigit:
    cmp al,0
    je l139
    sub al,30h


    l139:
    switch_first:
    xor cx,cx
    mov cl,1
    push cx

    num2test:
    cmp ch,01
    je startadd

    cmp bx,0
    je begin2
    jmp .theres1st

    jmp begin2
    ;--------------- - - - - - - -  - - - - - - - - - - - - - - - - - - - - - - - -  - - -  - - - - - - - - 
    ; for second number taking digits
    ;-- --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  - - 
    begin2:
    mov bx,offset sec_n
    inc bx
    xor cx,cx
    mov cl,[bx]
    add bx,cx


    .theres1st:
    xor dx,dx
    cmp bx,offset sec_n+1
    je .nodigit
    mov dl,byte ptr [bx]
    dec bx

    cmp bx,offset sec_n+1
    je  .nodigit

    .theres2nd:

    mov dh,byte ptr[bx]

    sub dl,30h
    sub dh,30h
    push ax
    mov ax,dx
    aad
    mov dx,ax
    pop ax

    dec bx

    jmp startadd

    .nodigit:
    cmp dl,0
    je l193
    sub dl,30h

    l193:
    pop cx
    switch_second:
    mov ch,01                        ;if al 1 no first left if ah 1no second  left
    push cx
    ;___________________________________________________
    ;-----------------------------------------------------------------------------------------
    ;- - - - - - -  - - -  - - - - -  - - - - - - - - - - - - - --  - - - - - - - - - - - - 
    ;adding the two numbers from ax and dx
    ;
    ;- - - - - - - - - - - - - - - - - -  - - - - - --- - - - -- - - - - - - - - -  -  - - 


    startadd:
    add ax,dx
    add al,carry

    mov carry,ah

    xor ah,ah

    cmp di,0          ;is di register have offset loaded to it
    jne    put_it         ; if not jump to put_it procedure

    mov di,offset result
    mov cl,byte ptr[di]
    xor ch,ch
    add di,cx


    put_it:
    cmp di,offset result
    je  l235
    mov byte ptr[di],al
    dec di
    xor cx,cx

    l235:
    pop cx
    ;----------------------
    label_end:
    cmp cx,0101h
    je last_carry
    jmp theres1st

    last_carry:
    nop

    ;______________________________________________
    ;/        time for display    ******  ****                     /
    ;/---------------------------------------------------------------/
    mov dx,offset resultm
    mov ah,09h
    int 21h

    xor ax,ax
    xor dx,dx
    xor bx,bx
    xor cx,cx
    xor si,si
    xor di,di

    mov di,offset result
    mov cl,[di]
    add di,cx


    mov dl,carry
    cmp dl,0
    je no_carryn
    add dl,30h
    mov ah,02h
    int 21h

    no_carryn:
    mov si,offset result+1

    .display:
    cmp si,di
    jng dumpit
    jmp final_p
    dumpit:
    xor ax,ax
    mov al, byte ptr[si]

    aam
    add ah,30h
    add al,30h

    xor dx,dx
    xor bx,bx

    ldisp:
    mov bx,ax

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

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


    inc si
    jmp .display


    final_p:
    nop


    mov ah,4ch
    int 21h


    main endp
    end main
...