深入探索汇编与C交互及文件I/O操作
1. 灵活的CALL指令
在汇编编程中,CALL指令有着独特的用法。以下代码片段中的两个CALL指令都是合法且等效的:
mov ebx, pull8 ; 将标签pull8代表的地址加载到EBX
call pull8 ; 调用pull8代表的地址
call ebx ; 调用EBX中存储的地址
这种方式能让我们将过程调用当作参数处理。例如在randtest里,把很多代码提取到名为puller的过程中,然后针对不同大小的随机数多次调用puller。通过将正确的随机数过程地址加载到EDI,传递给puller:
; 创建并显示一个8位随机值数组
mov edi,pull8 ; 将随机数子程序的地址复制到edi
call puller ; 按照[pulls]中的要求提取尽可能多的数字
在puller过程中,代码以如下方式调用所需的随机数过程:
puller:
mov esi,dword [pulls] ; 将提取计数放入ESI
.grab: dec esi ; 递减ESI中的计数器
call edi ; 提取值;结果返回在EAX中
mov [stash+esi*4],eax ; 将随机值存储在数组中
cmp esi,0 ; 查看是否已经提取足够的数字
jne .grab ; 如果ESI不为0,则继续
ret ; 否则返回
调用寄存器中的地址能极大地增强代码的
汇编与C交互及文件I/O详解
超级会员免费看
订阅专栏 解锁全文
53

被折叠的 条评论
为什么被折叠?



