加入2导致一个3位数的装配两个数字 [英] Adding 2 two-digit numbers that results to a 3-digit in assembly

查看:204
本文介绍了加入2导致一个3位数的装配两个数字的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我设法让加入基于乐于助人的人从线提供的解决方案两个数字的我创建了最后一次:

我如何使用ADC组装?

所以,现在,似乎有一个问题,当我加2号和他们的结果将是一个3位数字。命名IS_3DIGIT跳转处理这种可能性,但另外一些数字像80 + 80,99 + 99,+ 89 82都给予错误的结果。 56 + 77效果很好。所以,我的假设是超过79高于两数相加将给出错误的结果。我怎样才能解决这个问题呢?顺便说一句,像99 + 23或89 + 43加法给出正确的结果。

  .MODEL SMALL
.STACK 1000
。数据MSGA DB 13,10,输入第一个数字,$
MSGB DB 13,10,输入第二数量:,$
MSGC DB 13,10的总和为:,$NUM1分贝?
NUM2分贝?
NUM3分贝?。code主要PROC NEARMOV AX,@DATA
MOV DS,AX;获得第一个数字
LEA DX,MSGA
MOV AH,09H
INT 21HMOV AH,01
INT 21H
SUB AL,'0'MOV BL,ALMOV AH,01
INT 21H
SUB AL,'0'MOV CL,AL;获得第二个数字
LEA DX,MSGB
MOV AH,09H
INT 21HMOV AH,01
INT 21H
SUB AL,'0'MOV DL,ALMOV AH,01
INT 21H
SUB AL,'0'MOV DH,AL;加
MOV AL,CL
MOV AH,BL
ADD AL,DH
AAA
ADD AH,DLMOV NUM1,AL
ADD NUM1,'0';如果十位数小于或等于9
CMP AH,9
JLE NOT_3DIGITIS_3DIGIT:
MOV AL,AH;移动啊价值的人
SUB AH,AH;清楚啊
ADD AL,0;人+ 0 =人(十位)
AAA;移动加法
ADD AH,0;啊+ 0 + 1 =啊+ 1(百位数)
MOV NUM2,AL
MOV NUM3,AH
ADD NUM2,'0'
ADD NUM3,'0'
;输出总和
LEA DX,MSGC
MOV AH,09H
INT 21H
MOV DL,NUM3
MOV AH,02H
INT 21H
MOV DL,NUM2
MOV AH,02H
INT 21H
JMP PRINT_LASTDIGIT
NOT_3DIGIT:
MOV NUM2,AH
ADD NUM2,'0'
;输出总和
LEA DX,MSGC
MOV AH,09H
INT 21H
MOV DL,NUM2
MOV AH,02H
INT 21HPRINT_LASTDIGIT:
MOV DL,NUM1
MOV AH,02H
INT 21H出口:
MOV AH,4CH
INT 21HMAIN ENDP
END MAIN


解决方案

嗯,你这样做,是硬办法,真的。同样, AAA 可以做所有的辛勤工作,只要是正确的东西都在,所以不同的情况下,溢出并没有溢出是不是真的有必要。

像这样(未经):

 ;啊:人=几十:那些
加人,DH
AAA
;现在做啊:人hundres:数万
MOV BL,人
MOV人啊
XOR啊,啊;这将是百位数
加人,DL
AAA
;导致啊:人:BL

我把使用 DH DL 的从源和 BL 只是一些额外的地方。他们并不重要,但在的东西啊真的在那里,就像最后一次。

我读过的说明 AAA 添加很紧密,我的认为应该工作,即使第二个添加可添加10的东西,但我只有约90%的肯定。

I managed to make the addition of two-digit numbers based on the solutions provided by helpful people from the thread I created last time:

How do I use the ADC in assembly?

So now, there seems to be a problem when I add 2 numbers and their result will be a 3-digit number. The jump named IS_3DIGIT handles that possibility, but addition of some numbers like 80 + 80, 99 + 99, 89 + 82 all give wrong results. 56 + 77 works well. So my hypothesis is that adding two numbers higher than 79 will give wrong results. How can I resolve this problem? BTW, additions like 99 + 23 or 89 + 43 give correct results.

.MODEL SMALL
.STACK 1000
.DATA

MSGA DB 13,10,"Input first number: ","$"
MSGB DB 13,10,"Input second number:","$"
MSGC DB 13,10,"The sum is: ","$"

NUM1 db ?
NUM2 db ?
NUM3 db ?

.CODE

MAIN PROC NEAR

MOV AX, @DATA
MOV DS, AX

; get first number
LEA DX, MSGA
MOV AH, 09h
INT 21h

MOV AH, 01
INT 21H
SUB AL, '0'

MOV BL, AL

MOV AH, 01
INT 21H
SUB AL, '0'

MOV CL, AL

; get second number
LEA DX, MSGB
MOV AH, 09h
INT 21h

MOV AH, 01
INT 21H
SUB AL, '0'

MOV DL, AL

MOV AH, 01
INT 21H
SUB AL, '0'

MOV DH, AL

; add
MOV AL, CL
MOV AH, BL
ADD AL, DH
AAA 
ADD AH, DL

MOV NUM1, AL
ADD NUM1, '0'

; if tens digit is less than or equal to 9
CMP AH, 9
JLE NOT_3DIGIT 

IS_3DIGIT:
MOV AL, AH   ; move value of ah to al
SUB AH, AH   ; clear ah
ADD AL, 0    ; al + 0 = al (tens digit)
AAA          ; move for addition
ADD AH, 0    ; ah + 0 + 1 = ah + 1 (hundreds digit)
MOV NUM2, AL
MOV NUM3, AH
ADD NUM2, '0'
ADD NUM3, '0'
; output sum
LEA DX, MSGC
MOV AH, 09h
INT 21h
MOV DL, NUM3
MOV AH, 02H
INT 21h
MOV DL, NUM2
MOV AH, 02H
INT 21h
JMP PRINT_LASTDIGIT


NOT_3DIGIT:    
MOV NUM2, AH
ADD NUM2, '0'
; output sum
LEA DX, MSGC
MOV AH, 09h
INT 21h
MOV DL, NUM2
MOV AH, 02H
INT 21h

PRINT_LASTDIGIT:
MOV DL, NUM1
MOV AH, 02H
INT 21h

EXIT:
MOV AH, 4Ch
INT 21h

MAIN ENDP
END MAIN

解决方案

Well you did it the "hard way", really. Again, aaa can do all the hard work, as long as the right things are in ah and al, so different cases for overflow and no overflow aren't really necessary.

Something like this (untested):

; ah:al = tens:ones
add al,dh
aaa
; now make ah:al hundres:tens
mov bl,al
mov al,ah
xor ah,ah   ; this will be the hundreds digit
add al,dl
aaa
; result in ah:al:bl

I took the use of dh and dl from your source, and bl is just some extra place. They're not important, but the things in ah and al really have to be there, just as last time.

I've read the descriptions of aaa and add very closely, and I think that should work even though the second add can be adding 10 to something, but I'm only about 90% sure about that.

这篇关于加入2导致一个3位数的装配两个数字的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆