2017-01-24 6 views
-7

Я сгенерировал ниже дампа из программы, которая добавляет только два числа Я не могу понять логику добавления двух чисел В данном коде 6-я и 7-я строки, по моему мнению, нет смысла , пожалуйста, помогите с двумя линиямиСборка программы добавления двух чисел

add ecx,00001010 6th line 

and ecx,00002020 7th line 

 

 movzx ecx,%GWA+000000E0 : VAR1 
     movzx eax,%GWA+000000E8 : VAR2 
     sal  ecx,08 
     or  ecx,eax 
     mov  eax,ecx 
     add  ecx,00001010 
     and  ecx,00002020 
     jne  GLB.4 
     movzx ecx,%GWA+000000E0 : VAR1 
     movzx eax,%GWA+000000E8 : VAR2 
     and  ecx,0F0F0F0F 
     and  eax,0F0F0F0F 
     add  ecx,eax 
     add  ecx,F6F6F6F6 
     mov  eax,ecx 
     and  eax,60606060 
     shr  eax,04 
     and  ecx,0F0F0F0F 
     sub  ecx,eax 
     or  ecx,30303030 
     add  ecx,10 
     bswap ecx 
     shr  ecx,10 
     mov  %GWA+0000000A,cx : TRLP+0 
     jmp  GLB.5 
+0

@ user143252 Это ваша задача предоставить соответствующий вопрос в формате. Если вы этого не сделаете, вы получите downvotes. – fuz

+0

Сначала он добавляет 0x1010 в 'ecx', а затем выполняет побитовое И' ecx' с 0x2020. Это та часть, которую вы не понимаете? Что вы на самом деле спрашиваете здесь? –

+0

@CodyGray да точно, зачем это нужно? – user143252

ответ

1

этих двух линий проверки на «негативный» знак на любой из 16 бит зональных или неупакованных десятичных чисел, которые содержат одну десятичную цифру за байт (bcd - двоично-кодированное десятичное число) в младших битах (бит 0-3). Знак хранится в битах с 4 по 7 наименее значимого байта. Если посмотреть на последний байт с зонированным или распакованным десятичным числом, то значение 0x10, 0x50, 0x90, 0xd0 будет указывать на отрицательное число.

Код после jne GLB.4 выполняет распаковку bcd add, но затем он выполняет байтовый обмен, поэтому я не уверен, что он делает с суммой.

Можете ли вы включить разделение данных Cobol для двух чисел и разделение процедуры для добавления?

;  using desktop calculator in hex mode 
;    ecx = 002030405h  ;decimal 2345 
;    eax = 002070809h  ;decimal 2789 
     add  ecx,eax    ;ecx = 0040A0C0Eh 
     add  ecx,0F6F6F6F6h  ;ecx = 0FB010304h ;F6 does carries 
     mov  eax,ecx    ;eax = 0FB010304h 
     and  eax,060606060h  ;eax = 060000000h ;eax = value to subtract 
     shr  eax,004    ;eax = 006000000h ; for the non carries 
     and  ecx,00F0F0F0Fh  ;ecx = 00B010304h ;clear any 'F's 
     sub  ecx,eax    ;ecx = 005010304h ;fix the non carries 
             ;ecx = decimal 5134 
+0

Yup я сделаю, спасибо за помощь – user143252

+0

Я добавил info @rcgldr – user143252

+0

@ user143252 - То, что я ищу, это исходный код Cobol для переменных VAR1 и VAR2 и исходный код, который показывает добавление. – rcgldr