Я не могу понять, почему моя программа не работает
в моей процедуре я собираюсь взять переменное число, процесс
это и положить его на сегмент данных, то я хочу, чтобы отобразить
это число, используя функцию ах, 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 выглядит так
вот код и фото;
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
вот мое фото при работе в отладчике
Вот полный код
.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