crc_cal proc far
var_4= word ptr -4
arg_0= word ptr 6
arg_2= dword ptr 8
mov ax, seg dseg37
inc bp
push bp
mov bp, sp
push ds
mov ds, ax
sub sp, 2
push si
push di
xor cx, cx
mov dx, 0FFFFh
mov [bp+var_4], 8408h
loc_42646:
les bx, [bp+arg_2]
add bx, cx
mov al, es:[bx]
xor al, dl
mov dl, al
inc cx
xor di, di
jmp short loc_42672
loc_42657:
mov si, dx
dec si
mov ax, si
shr ax, 1
mov si, ax
mov ax, dx
shr ax, 1
mov dx, ax
cmp si, dx
jnz short loc_42671
mov ax, dx
xor ax, [bp+var_4]
mov dx, ax
loc_42671:
inc di
loc_42672:
cmp di, 8
jb short loc_42657
cmp cx, [bp+arg_0]
jb short loc_42646
mov ax, dx
not ax
mov dx, ax
les bx, [bp+arg_2]
add bx, cx
mov es:[bx], dl
inc cx
mov ax, dx
shr ax, 8
mov dx, ax
les bx, [bp+arg_2]
add bx, cx
mov es:[bx], dl
inc cx
pop di
pop si
pop cx
pop ds
pop bp
dec bp
retf
crc_cal endp
| DATA |Inc|CRC|
|----------------------------------------------------------|---|---|
00 00 00 00 00 00 01 ef f7 fe ef ff fd ef fb fa fd a2 aa 21 01 f4 e0
00 00 00 00 00 00 01 ef f7 fd ef ff fd fe fb fa fd a2 aa 21 02 f4 d1
00 00 00 00 00 00 01 f7 fe fd fd ff fd df ff fb fd a2 aa 21 03 f4 cd
00 00 00 00 00 00 01 f7 fe fe fd ff f7 ef ff fa fd a2 aa 21 04 f4 c2
00 00 00 00 00 00 01 ef f7 fe ef ff fe ef fb fa fd a2 aa 21 05 f4 db
00 00 00 00 00 00 01 ef f7 fe ef ff fd ef fb fa fd a2 aa 21 06 f4 db
所示数据与《儿童权利公约》不符,如本答复所述:
查找使用的CRC-16算法
该代码是一个过于复杂的右移CRC实现(以dx为单位),poly=0x8408,初始值=0xFFFF,xor out=0xFFFF。检查每行后面的2个字节,看看这是否是追加CRC的地方。
crc_cal proc far
var_4 = word ptr -4 ; used to store poly
arg_0 = word ptr 6 ; number of bytes of data
arg_2 = dword ptr 8 ; far pointer to data
mov ax, seg dseg37 ; for ds that is never used
inc bp ; bp += 1, (bp&1 == far call indicator)
push bp ; save bp+1
mov bp, sp ; bp = sp, base for the equated offsets
push ds ; save ds
mov ds, ax ; ds = dseg37 (never used)
sub sp, 2 ; allocate space for poly (var_4)
push si ; save si, di
push di
xor cx, cx ; cx = offset to data
mov dx, 0FFFFh ; dx = initial crc
mov [bp+var_4], 8408h ;store poly
loc_42646:
les bx, [bp+arg_2] ; al = next byte of data
add bx, cx
mov al, es:[bx]
xor al, dl ; crclo ^= data
mov dl, al
inc cx ; increment offset to data
xor di, di ; di = bit counter (0 to 7)
jmp short loc_42672
loc_42657:
mov si, dx ; si = (crc-1)>>1
dec si ; if lsb was 0, then
mov ax, si ; si != dx later on
shr ax, 1
mov si, ax
mov ax, dx ; dx = (crc)>>1
shr ax, 1
mov dx, ax
cmp si, dx ; br if prior lsb of crc was 0
jnz short loc_42671
mov ax, dx ; crc ^= 0x8408
xor ax, [bp+var_4]
mov dx, ax
loc_42671:
inc di ; increment bit counter
loc_42672:
cmp di, 8 ; loop till byte done
jb short loc_42657
cmp cx, [bp+arg_0] ; loop till all bytes done
jb short loc_42646
mov ax, dx ; dx = ~ crc
not ax
mov dx, ax
les bx, [bp+arg_2] ; append crc to data, lsbyte first
add bx, cx
mov es:[bx], dl
inc cx
mov ax, dx
shr ax, 8
mov dx, ax
les bx, [bp+arg_2]
add bx, cx
mov es:[bx], dl
inc cx ; useless, cx gets overwritten below
pop di ; restore di, si
pop si
pop cx ; cx = poly
pop ds ; restore ds, bp
pop bp
dec bp ; bp -= 1 (undo inc bp from above)
retf
crc_cal endp
正如你已经发现的,调试汇编代码非常的困难和容易受到挫折。 我建议你先把你需要优化的小段代码用高级语言写成一个子程序。 然后写个小的测试程序可以充分测试你的这个子程序。 确认测试程序可以测试到所有的分支和边界条件。 当高级语言的子程序可以工作了,你再把它翻译成汇编代码。 现在你可以开始优化了。 每次你做了点修改都应该运行测试程序看看能不能正确工作。 将你所有的版本都标上号并保存起来,这样在发现测试程
只要不使用C的标准库函数,Go中是可以直接调用C和汇编语言的。其实道理很简单,Go的运行时库就是用C和汇编实现的,Go必须是能够调用到它们的。当然,会有一些额外的约束,这就是函数调用协议。 Go中调用汇编 假设我们做一个汇编版本的加法函数。首先GOPATH的src下新建一个add目录,然后在该目录加入add.go的文件,内容如下: package add func Add(a, b uint64
为了更加深入理解C语言的本质,我们需要学习一些汇编相关的知识。作为最基本的编程语言之一,汇编语言虽然应用的范围不算很广,但是非常重要。因为它能够完成许多其它语言所无法完成的功能。就拿 Linux 内核来讲,虽然绝大部分代码是用 C 语言编写的,但仍然不可避免地在某些关键地方使用了汇编代码,其中主要是在 linux 的启动部分。由于这部分代码与硬件的关系非常密切,即使是 C 语言也会有些力不从心,而
问题内容: 我有用32位汇编语言编写的程序…现在,我无法在64位OS上对其进行编译。在我们学校,它们是特定的,程序必须以32位版本编写。这是我的程序: 任何的想法?我尝试了很多方法来编译它。编译后输出错误: 输出: 问题答案: 首先将更改为并将符号更改为,然后使用链接目标文件,该文件将自动链接至该文件, 您需要这样做,因为AFAIK如果没有,就无法链接至libc。另外,在汇编时也应使用elf32而
问题内容: 是否有类似于Java的OllyDbg / SoftICE的实用程序?即执行类(从jar /具有类路径),并且没有源代码,显示了中间代码的反汇编,能够逐步执行/遍历/搜索引用/在内存中编辑特定的中间代码/将编辑应用于文件。 。 如果不是,甚至有可能编写类似这样的内容(假设我们愿意在调试期间没有热点的情况下生存)? 编辑:我不是在谈论JAD或JD或Cavaj。这些是很好的反编译器,但是由于