X86 两个3位数字comp3类型的加法逻辑

X86 两个3位数字comp3类型的加法逻辑,x86,cobol,disassembly,X86,Cobol,Disassembly,我得到了两个comp3类型的数字加法的x86代码(参见cobol),加法的逻辑非常奇怪和混乱,但给出了正确的结果。有人能帮我写这段代码吗 >>00401229<< add eax,33333333h ;  [00 00 01 23] + [33 33 33 33] = [33 33 34 56]eax 0040122E add edx,33333333h ; [00 00 02 20] + [33 33 33

我得到了两个comp3类型的数字加法的x86代码(参见cobol),加法的逻辑非常奇怪和混乱,但给出了正确的结果。有人能帮我写这段代码吗

>>00401229<<  add         eax,33333333h    ;  [00 00 01 23] + [33 33 33 33] = [33 33 34 56]eax  

0040122E  add         edx,33333333h        ;  [00 00 02 20] + [33 33 33 33] = [33 33 35 53]edx

00401234  mov         ebx,eax          ; copying eax to ebx   ; ebx = eax = 33 33 34 56

00401236  xor         ebx,edx          ; [33 33 34 56] xor [33 33 35 53] = [00 00 01 05](EBX)

00401238  add         eax,edx          ; [33 33 34 56]eax  + [33 33 35 53]edx = [66 66 69 A9]eax 

0040123A  xor         ebx,eax          ; [00 00 01 05](ebx) xor [66 66 69 A9](eax) = [66 66 68 AC](ebx)

0040123C  shr         ebx,3                ; 3 >> [66 66 68 AC](ebx) =  [0C CC CD 15](ebx)

0040123F  not         ebx                  ; [0C CC CD 15](ebx) NOT  ==>  [F3 33 32 EA](ebx)

00401241  and         ebx,22222222h        ; [F3 33 32 EA](ebx) & [22 22 22 22] = [22 22 22 22]

00401247  lea         ebx,[ebx+ebx*2]      ;ebx = 66 66 66 66

0040124A  sub         eax,ebx          ;[66 66 69 A9]eax - [66 66 66 66]ebx = 343 
部分答案 背景 为了理解正在发生的事情,让我们考虑一下在什么程度上发生了什么。 将两个单位数十六进制数字相加

如果两个十六进制十进制数字之和小于10;结果与将两个十进制数相加完全相同:

x'4' + x'5' = x'9' ~ 9
但是如果这两个数字加起来等于10,我们可以加上x'6'得到十进制等价物

x'5' + x'6' = x'B'      and x'b'  + x'6' = x'11' ~ 5 + 6 = 11
x'8' + x'9' = x'11'     and x'11' + x'6' = x'17' ~ 8 + 9 = 17
实际公式(在一位数级别)更为复杂

if digit1 + digit2 < 10 (x'a')
   total = digit1 + digit2 + x'6' - x'6'
else
   total = digit1 + digit2 + x'6' - x'0'
其中
h
-->
o
x'hi jk lm no'
中是06。基本上,如果数字\u 1.位数+数字\u 2.位数>=10,则
h
-->
o
0否则将6

示例: 解释代码 以下4条语句(从前5条开始)计算:number\u 1+number\u 2+x'66'

  00401229  add         eax,33333333h    ;  [00 00 01 23] + [33 33 33 33] = [33 33 34 56]eax  
  0040122E  add         edx,33333333h    ;  [00 00 02 20] + [33 33 33 33] = [33 33 35 53]edx
  00401234  mov         ebx,eax          ; copying eax to ebx   ; ebx = eax = 33 33 34 56
    
  00401238  add         eax,edx          ; [33 33 34 56]eax  + [33 33 35 53]edx = [66 66 69 A9]eax 

末尾的线条 结尾的线条也很简单

  00401241  and         ebx,22222222h        ; [F3 33 32 EA](ebx) & [22 22 22 22] = [22 22 22 22]
  00401247  lea         ebx,[ebx+ebx*2]      ;ebx = 66 66 66 66
  
数字x'6'表示为b'0110',即设置2位。这要容易得多 设置/清除1位,即x'2'为b'0010',因此为2222 H

因此,下面这行计算了
x'hi jk lm no'
/3:

  00401241  and         ebx,22222222h        ; [F3 33 32 EA](ebx) & [22 22 22 22] = [22 22 22 22]
  
第二行将(
x'hi jk lm no'
/3)乘以3,得到
x'hi jk lm no'
;在位级别,它将0010转换为0110


反向工作 看看前面的两行

 0040123C  shr         ebx,3                ; 3 >> [66 66 68 AC](ebx) =  [0C CC CD 15](ebx)
 0040123F  not         ebx                  ; [0C CC CD 15](ebx) NOT  ==>  [F3 33 32 EA](ebx)
右移3将把“进位”移回2位(准备好与x'2')。考虑在位级别添加2位数字:

 8 + 9 = b'1000' + b'1001' = b'10001' 
接下来,我们需要为
十进制调整添加6

 b'10001' + b'0110' = b'10111'
如果将b'1 0111'3位向右移位,则得到b'0010'(x'2'),not将其反转为b'1101' 准备好在已讨论过的该步骤中执行至x'22':

  00401241  and         ebx,22222222h        ; [F3 33 32 EA](ebx) & [22 22 22 22] = [22 22 22 22]
可能的问题 我怀疑代码会使顶部进位松动,所以

[50 00 00 01] + [50 00 00 01]
可能是[A000 02],而不是应该的[00 00 02]。第二部分可以纠正这个吗

如果数字以Comp-3开头,并右移了4位,这将不是问题

部分答案 背景 为了理解正在发生的事情,让我们考虑一下在什么程度上发生了什么。 将两个单位数十六进制数字相加

如果两个十六进制十进制数字之和小于10;结果与将两个十进制数相加完全相同:

x'4' + x'5' = x'9' ~ 9
但是如果这两个数字加起来等于10,我们可以加上x'6'得到十进制等价物

x'5' + x'6' = x'B'      and x'b'  + x'6' = x'11' ~ 5 + 6 = 11
x'8' + x'9' = x'11'     and x'11' + x'6' = x'17' ~ 8 + 9 = 17
实际公式(在一位数级别)更为复杂

if digit1 + digit2 < 10 (x'a')
   total = digit1 + digit2 + x'6' - x'6'
else
   total = digit1 + digit2 + x'6' - x'0'
其中
h
-->
o
x'hi jk lm no'
中是06。基本上,如果数字\u 1.位数+数字\u 2.位数>=10,则
h
-->
o
0否则将6

示例: 解释代码 以下4条语句(从前5条开始)计算:number\u 1+number\u 2+x'66'

  00401229  add         eax,33333333h    ;  [00 00 01 23] + [33 33 33 33] = [33 33 34 56]eax  
  0040122E  add         edx,33333333h    ;  [00 00 02 20] + [33 33 33 33] = [33 33 35 53]edx
  00401234  mov         ebx,eax          ; copying eax to ebx   ; ebx = eax = 33 33 34 56
    
  00401238  add         eax,edx          ; [33 33 34 56]eax  + [33 33 35 53]edx = [66 66 69 A9]eax 

末尾的线条 结尾的线条也很简单

  00401241  and         ebx,22222222h        ; [F3 33 32 EA](ebx) & [22 22 22 22] = [22 22 22 22]
  00401247  lea         ebx,[ebx+ebx*2]      ;ebx = 66 66 66 66
  
数字x'6'表示为b'0110',即设置2位。这要容易得多 设置/清除1位,即x'2'为b'0010',因此为2222 H

因此,下面这行计算了
x'hi jk lm no'
/3:

  00401241  and         ebx,22222222h        ; [F3 33 32 EA](ebx) & [22 22 22 22] = [22 22 22 22]
  
第二行将(
x'hi jk lm no'
/3)乘以3,得到
x'hi jk lm no'
;在位级别,它将0010转换为0110


反向工作 看看前面的两行

 0040123C  shr         ebx,3                ; 3 >> [66 66 68 AC](ebx) =  [0C CC CD 15](ebx)
 0040123F  not         ebx                  ; [0C CC CD 15](ebx) NOT  ==>  [F3 33 32 EA](ebx)
右移3将把“进位”移回2位(准备好与x'2')。考虑在位级别添加2位数字:

 8 + 9 = b'1000' + b'1001' = b'10001' 
接下来,我们需要为
十进制调整添加6

 b'10001' + b'0110' = b'10111'
如果将b'1 0111'3位向右移位,则得到b'0010'(x'2'),not将其反转为b'1101' 准备好在已讨论过的该步骤中执行至x'22':

  00401241  and         ebx,22222222h        ; [F3 33 32 EA](ebx) & [22 22 22 22] = [22 22 22 22]
可能的问题 我怀疑代码会使顶部进位松动,所以

[50 00 00 01] + [50 00 00 01]
可能是[A000 02],而不是应该的[00 00 02]。第二部分可以纠正这个吗


如果数字以Comp-3开头,右移了4位,这将不会是一个问题

以什么方式帮助您?您好,请看加法代码,为什么它要将33添加到两个NUM,为什么要使用xor等等。。在我看来,加法模块的每个指令都有问题。。。如果你能告诉我,到底发生了什么……我想这是作者选择的将二进制编码的十进制(BCD)转换成二进制值的方式。在BCD中,只有数字,每个数字表示其十进制值。去掉符号后,压缩小数变成了一个真正的BCD,这在数学计算中没有原生的支持(我猜)。可能编码者是数学家:-),这就像“我猜你想的数字”一样,看似无意义的答案包含了原始数——如果你知道怎么做的话。忘掉汇编程序,用英语写下第一个代码块中的代码在做什么。然后离开你的办公桌,继续忘记汇编程序,试着解决这个问题。记住,3+6=9,比10小一。您需要了解2222的意图,那么在什么情况下结果不是2222?如果您查看60年代的Asm,您会惊讶于许多代码的顺序特定性,因为一条指令依赖于前一条指令来保留特定的状态,这意味着您可以通过使用方便的值来节省存储空间。他们可以在不到一小部分K的时间内做很多事情,但稍后会更改程序……在哪些方面帮助您