2012-07-19 37 views
5
.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 
ADD CL, DH 
ADC BL, DL 
MOV NUM1, CL 
ADD NUM1, '0' 
MOV NUM2, BL 
ADD NUM2, '0' 

; output sum 
LEA DX, MSGC 
MOV AH, 09h 
INT 21h 

MOV DL, NUM2 
MOV AH, 02H 
INT 21h 

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

MOV AH, 4Ch 
INT 21h 

MAIN ENDP 
END MAIN 

Phía trên là mã của tôi để thêm 2 số có hai chữ số vào trong hội đồng. Tôi tự hỏi tại sao ADC không hoạt động. Nếu những chữ số không nhận được một carry khi được thêm vào, mã của tôi hoạt động. Nhưng không phải khác. Tôi có hiểu lầm những gì ADC thực sự làm không? Tôi nên làm gì với mã của mình?Làm thế nào để sử dụng ADC trong lắp ráp?

+1

'ADC' thực sự không sử dụng ở đây vì việc thêm 2 chữ số sẽ không bao giờ cho kết quả không thể sửa trong byte. – m0skit0

+0

Tôi có nghĩa là "phù hợp" không "sửa chữa" xin lỗi – m0skit0

Trả lời

4

Dường như bạn đang làm việc với phép toán thập phân, nhưng bạn không sử dụng AAA. ADC làm những gì bạn mong đợi, nhưng với mã đó, không bao giờ có một thực tế thực hiện từ việc bổ sung đầu tiên (9 + 9 là không lớn hơn 255, sau khi tất cả).

Vì vậy, các giải pháp, tất nhiên, là sử dụng AAA, như thế này (không kiểm tra):

add al,dl 
aaa  ; takes no arguments and works on al 
add ah,dh ; adc not necessary, aaa already incremented ah if there was a carry 

AAA (ASCII Adjust for Addition) kiểm tra nếu al lớn hơn 9, và nếu như vậy:

  • điều chỉnh al,
  • đặt cờ carry, và
  • increments ah
+0

Tôi xin lỗi tôi mới tham gia hội thảo.Aaa và xchg thực sự làm gì? –

+0

@jrmeasures nó hoán đổi (eXCHanGes) hai điều – harold

+0

còn aaa thì sao? –

1

Kiểm tra câu hỏi này tại đây theo số SO câu trả lời giải thích cách ADC - Thêm với các công việc mang theo. Về cơ bản, bạn cần cộng các byte thứ tự thấp trước bằng cách sử dụng lệnh ADD đơn giản. Sau đó, thêm các byte thứ tự cao bằng cách sử dụng ADC (thêm với carry), nó sẽ thêm carry nếu byte thấp hơn thêm tạo ra một carry.

Ví dụ, nếu bạn đang thêm AX và BX bạn sẽ làm như sau: số học thập phân

add al, bl 
adc ah, bh ; include the carry if previous add generated one 

Theo các ý kiến ​​cho câu hỏi của bạn đã đề cập, bạn đang thực sự thực hiện bằng cách lấy từng ký tự ASCII sau đó trừ đi " 0 'từ nó. Mỗi hoạt động này sẽ chỉ tạo ra một số nhị phân từ 0 đến 9 được lưu trữ trong thanh ghi 8 bit. Theo nhận xét, việc cộng hai số với nhau dưới 10 sẽ không bao giờ dẫn đến việc thực hiện chỉ có thể xảy ra khi kết quả lớn hơn 256.

Nếu bạn tiếp tục sử dụng phương pháp thực hiện tác vụ này, thì bạn cần kiểm tra thủ công nếu việc bổ sung hai chữ số thập phân thấp hơn đã gây ra việc kiểm tra nếu kết quả của việc cộng thêm lớn hơn 10 và nếu nó được trừ đi 10 từ số và sau đó cộng 1 vào số thứ tự cao hơn.

Điều đó có hợp lý không?

Đây có phải là bài tập về nhà không? Nếu có, đó là mục đích của nhiệm vụ để tìm hiểu cách thực hiện công việc hoặc chỉ viết một chương trình để thêm hai số có hai chữ số với nhau?

+0

hãy nhìn vào mã của tôi, tôi có hai dòng giống với ví dụ đó. –

+0

Xem câu trả lời được đăng bởi @harold. Giải pháp của anh ta tốt hơn vì nó sử dụng một lệnh gọi là [Ascii Adjust after Additon] (http://docs.oracle.com/cd/E19957-01/816-1323/instructionset-52/index.html) để hoàn thành những gì bạn cần để làm và cũng sử dụng cờ mang để hoàn thành những gì bạn cần làm. – HeatfanJohn

+0

Tôi chỉ muốn viết chương trình bổ sung số có hai chữ số –

Các vấn đề liên quan