Язык ассемблера 8086 добавить с использованием 32-битной регистрации и дать значение в 64-битной версии?

Я хочу добавить значение1 к значению2, используя 32-битный регистр, и дать значение менее 64 бит (равно 16 цифрам). Можно ли использовать пространство в 2 регистра (32+32 = 64 бита)? Я думаю, что это можно сделать с помощью PTR OPERATOR, но я не знаю, как использовать инструкцию PTR.

Я сделал программу для добавления. Он принимает два значения в консоли и возвращает нам результат. Он может принимать значение менее 32 бита (8 цифр). Если мы дадим более высокое значение, это выдаст ошибку целочисленного переполнения в консоли.

Я использую библиотеки ссылок KIP.R.IRVINE на языке ассемблера.

Как мы получим 64-битное значение, используя 32-битные регистры? Как сделать так, чтобы 32-битные регистры принимали 64-битные значения?

Вот код для 32-битного добавления

INCLUDE Irvine32.inc

.data

Addition BYTE "A: Add two Integer Numbers", 0

inputValue1st BYTE "Input the 1st integer = ",0
inputValue2nd BYTE "Input the 2nd integer = ",0

 outputSumMsg BYTE "The sum of the two integers is = ",0

 num1 DD ?
 num2 DD ?
 sum  DD ?

 .code

 main PROC

;----Displays addition Text-----

mov edx, OFFSET Addition
call WriteString
call Crlf
;-------------------------------

; calling procedures here

call InputValues
call addValue
call outputValue

call Crlf

jmp exitLabel


main ENDP


; the PROCEDURES which i have made is here


InputValues PROC
;----------- For 1st Value--------


call Crlf
mov edx,OFFSET inputValue1st ; input text1
call WriteString

; here it is taking 1st value
call ReadInt    ; read integer
mov num1, eax   ; store the value




;-----------For 2nd Value----------



mov edx,OFFSET inputValue2nd ; input text2
call WriteString


; here it is taking 2nd value
call ReadInt    ; read integer
mov num2, eax   ; store the value

ret
InputValues ENDP




;---------Adding Sum----------------

addValue PROC
; compute the sum

mov eax, num2  ; moves num2 to eax
add eax, num1  ; adds num2 to num1
mov sum, eax   ; the val is stored in eax

ret
addValue ENDP

;--------For Sum Output Result----------

outputValue PROC

; output result

mov edx, OFFSET outputSumMsg ; Output text
call WriteString


mov eax, sum
call WriteInt ; prints the value in eax


ret
outputValue ENDP


exitLabel:
exit


END main

person Mustafa Halai    schedule 20.04.2013    source источник
comment
PTR не является инструкцией, и очевидно, что 64 бита не помещаются в 32 бита. Сумма двух 32-битных чисел составляет всего 33 бита, а дополнительный бит находится во флаге переноса.   -  person harold    schedule 20.04.2013
comment
я могу использовать 2 регистра 32-битных и дать 64-битное значение, но я не знаю, как его использовать...   -  person Mustafa Halai    schedule 21.04.2013


Ответы (1)


Вы можете просто использовать CF (флаг переноса), чтобы определить, было ли переполнение при добавлении двух целых чисел. Перенос сложения двух целых чисел шириной n-bit никогда не может быть больше одного бита, но обратите внимание, что вы можете сделать это только при сложении без знака. Сложение со знаком с 64-битным результатом требует двух 64-битных целых чисел.

Вот пример беззнакового 32-битного сложения, приводящего к переносу одного бита.

mov eax, (1<<31)|1 ;set Most-Significant Bit (MSB) to 1, what will surely cause overflow
mov ebx, (1<<31)|1
add eax, ebx
jc .go             ;we need another bytes for our carry

подписанная версия:

;let eax and ebx be the numbers we want to add
cdq   ;expand 4-byte integer to 8-byte integer <-- this won't affect real value of EAX
xchg eax, ebx  ;cdq has fixed operands, change eax with ebx
xchg edx, ecx  ;... and edx with ecx
cdq   ;do the same for number that was in EBX

add eax, ebx
adc edx, ecx   ;that 'c' on the end is important, it will add 
               ;the carry flag to the result so possible overflow will be handled
;Result is now in EDX:EAX
person user35443    schedule 12.08.2013