X86 两个3位数字comp3类型的加法逻辑
我得到了两个comp3类型的数字加法的x86代码(参见cobol),加法的逻辑非常奇怪和混乱,但给出了正确的结果。有人能帮我写这段代码吗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
>>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'
中是0或6。基本上,如果数字\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'
中是0或6。基本上,如果数字\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的时间内做很多事情,但稍后会更改程序……在哪些方面帮助您