2016-09-11 7 views
-4

Я довольно смущен тем, как найти сумму целых чисел с использованием 8-битного регистра AL? Любой намек был бы замечательным. Спасибо.Добавить целые числа 20, 30, 50 и 160 с использованием регистра 8-битAL в сборке с использованием MOVZX

TITLE Add    (AddSub.asm) 

; This program adds and subtracts 32-bit integers. 
;Problem 1 Add 20, 30, 50,160 al hint move ax,0 to start 
; Last update: 2/1/02 

TITLE Add    (AddSub.asm) 

INCLUDE Irvine32.inc 

.code 
main PROC 

    mov al,20d  
    add al,30d  
    add al,50d  
    add al,160d 
    call DumpRegs 

    call writedec 
    exit 
main ENDP 
END main 
+1

hint: 260> 256. Вы не можете этого сделать. –

+0

Я знаю, но мне сказали, что есть способ сделать это с помощью MOVZX? Спасибо. –

+2

Вы можете получить 260, если вы не используете AL, но AX. Худший случай, AH: AL (тот же регистр просматривается по-разному). Вычисление в восьми битах, а затем нулевое расширение, которое не будет работать. –

ответ

2

При добавлении номера в AL и происходит переполнение, что вы получите младшие 8 бит результата в AL и Карри флаг установлен. Если вы просматриваете флаг Carry и регистр AL как 9-битное количество, это сумма, которую вы ищете. (И 9-разрядное количество достаточно велико, чтобы представлять 260.)

Инструкция «АЦП» означает «Добавить с переносом», поэтому, если у вас уже есть AH, установленный на ноль (с MOVZX, возможно?), Вы может сделать ADC AH,0, и это по существу добавит флаг переноса в AH, а затем AX будет содержать ваш результат.

Там вы идете, это намного больше, чем подсказка, это практически решение.

+0

Я извиняюсь, но будет код выглядеть так: TITLE Добавить (AddSub.asm) ВКЛЮЧИТЬ Irvine32.inc .Code главный PROC \t мов аль, 20d \t \t \t добавить Al, 30d \t \t \t добавить ал, 50d \t \t \t АДЦ аль, 160d \t \t mov al, 0FFh \t add al, 1 \t \t; CF = 1, AL = 00 \t \t DumpRegs вызов \t вызов writedec \t выхода главный ENDP END Основные Большое вам спасибо за вашу помощь –

+0

Я новичок в сборке и очень noobish. Пожалуйста, прости меня. Спасибо –

+1

Uhm, no. 'mov al, 0FFh add al, 1' не имеет смысла. Все, что вам нужно, это 'adc ah, 0', при условии, что' ah' уже был равен нулю перед добавлениями. Прочтите мой ответ еще раз. –

1

ax состоит из ah и al.

movzx is mov с "zero extended", может использоваться для копирования более короткого значения в более крупный пункт назначения.

movzx ah,0 не является законным, он перемещается в постоянный 8b в регистр 8b, ничего не расширяется (mov ah,0 достаточно).

movzx ax,BYTE 20 будет иметь нулевое расширение 8 бит постоянной 20 и сохранить его в 16 бит ax.

Это эквивалентно mov al,20 mov ah,0 или mov ax,WORD 20 (или несколько тысяч других вариантов, как загрузить значение байта 20 в al и ноль в ah, один из наиболее распространенных из них заключается в использовании xor ah,ah).

После того, как вы весь ax инициализации, вы можете либо изменить add al,#i в 16b вариант add ax,#i, или сочинить ту же самую вещь из двух 8b добавить инструкции, как add al,#i (CF флаг = Карри сета, когда результат сделал переполнение 8b) adc ah,0 (добавление CF до ah).

Попробуйте применить это к ответу Майка, если вы все еще потеряли, получите хорошую книгу/учебник/лекцию.

Как вы можете спросить что-то вроде «Значит, возможны только регистры AX и EAX?»? Это означает, что вы ничего не читали (или не понимали) о ассемблере x86. Но вы уже пытаетесь написать код? Сначала выходите на некоторые лекции, и несколько раз перечитывать несколько замечательных книг или лекций несколько раз, и все это будет в некоторой степени более ощутимым. На данный момент вам сложно ответить на этот вопрос, не задумываясь о том, что у вас есть в классе.

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

  • Нет связанных вопросов^_^