2015-05-12 4 views
0

У меня есть 32-разрядное число, хранящееся в eax, и 32-разрядное число, хранящееся в ebx. Я хочу объединить их в одно 64-битное число, определенное в разделе .bss как finalNum, но я не уверен, как это сделать. Я попыталсяПереместить несколько регистров в одну переменную

mov esi, finalNum 
mov [esi], eax 
add esi, 32 
mov [esi], ebx 

, но по какой-то причине, когда я пытаюсь распечатать finalNum он не печатает правильно, так я предполагаю, что есть проблема в этих 4-х строк. Также это в 32-битном nasm.

редактировать:

Так что я попытался

mov esi, finalNum 
    mov [esi+0], eax 
    mov [esi+4], ebx 

Но, все-таки придумать какой-то странной печати, я объявил finalNum в

finalNum: resb 8 

вы думаете, это может быть проблема?

Edit:

Enter first number to multiply: 
    34567 
    Enter second number to multiply: 
    76543 
    First Num: 34567 
    Second Num: 76543 
    Addition: 111110 
    Multiply: 
    ▒EAX : 0 
    EBX : -1649105415 

, как вы видите, когда я умножать и распечатать я получаю странный характер.

Edit: Код для распечатки результатов

mov  eax, SYSCALL_WRITE ; write message 
    mov  ebx, STDOUT 
    mov  ecx, msg7 
    mov  edx, len7 
    int  080h 

    mov  eax, SYSCALL_WRITE ; write user input 
    mov  ebx, STDOUT 
    mov  ecx, finalNum 
    mov  edx, BUFLENFINAL 
    int  080h 

BUFLENFINAL = 8, кстати

+0

«Странная печать» может быть много чего. Отправьте соответствующее сообщение об ошибке, так как представленный вами код выглядит действительным. –

+0

Вы посмотрели руководство NASM или посмотрели примеры NASM в Интернете? – lurker

+0

Каков твой код для печати 'finalNum'? – Nayuki

ответ

3

Нижний заказ слово 64-разрядное число идет в нижних 4 байта finalNum а более высокого порядка слов идет в высших 4 байта finalNum:

mov esi, finalNum ; Load address of where to store 64-bit number 
mov [esi+0], eax ; Store low 32 bits 
mov [esi+4], ebx ; Store high 32 bits 
+0

Это didn 't полностью работает, поэтому я добавил редактирование, возможно, вы могли бы проверить –

+0

Я бы написал «mov esi, offset finalNum», чтобы ясность ассемблеру, который вы хотите получить. –

+0

при использовании mov esi, offset finalNum Я получаю ошибку, ошибка: запятая, двоеточие или конец строки ожидается :( –

0

альтернатива:

finalNum: qword 0 

    .... 

    mov dword ptr finalNum, eax 
    mov dword ptr finalNum+4, ebx 
+0

qword находится в 64-битный, правда? –

+0

Да, qword * означает * "64-битное значение". Это именно то, что вы сказали, что хотите для finalNum, так заявляйте так. –

+0

@Alex: Вы используете NASM. Я привык использовать MASM; синтаксис инструкций может отличаться для непосредственных операндов. Возможно, я просто добавил к твоей путанице; «смещение», которое я заметил в ответе Найюки, может быть неправильным для NASM. Ответ, который я написал здесь, касается синтаксиса MASM и может не работать с NASM. –

Смежные вопросы