- 注册时间
- 2004-10-13
- 最后登录
- 2019-5-15
⑧专业
*永恒国度*
- 积分
- 14145

|
就是这样一个简单的C程序,对应的汇编代码如此之长,看了半天没看懂。
怎么好像看不到有向数组分配1,2,3之类的代码呢? 
麻烦大大们能帮我翻译下下面的汇编程序。
void main(void)
{
int i;
int a[3]={1,2,3};
}
/*
;栈0bef:0060
0B76:01FA 55 PUSH BP
0B76:01FB 8BEC MOV BP,SP ;bp入栈 ,这里BP=7E
0B76:01FD 83EC06 SUB SP,+06 ;栈预留3个字单元
0B76:0200 16 PUSH SS ;ss入栈 ss=0bef bp-3个字-ss
0B76:0201 8D46FA LEA AX,[BP-06] ;预留位第一位地址送入AX,ax=78
0B76:0204 50 PUSH AX ;bp-3个字-ss-第一个字的地址
0B76:0205 1E PUSH DS ;bp-3个字-ss-第一个字的地址-ds
0B76:0206 B89401 MOV AX,0194
0B76:0209 50 PUSH AX ;bp-3个字-ss-第一个字的地址-ds-0194
0B76:020A B90600 MOV CX,0006
0B76:020D 9A6C05760B CALL 0B76:056C
0B76:0212 8BE5 MOV SP,BP
0B76:0214 5D POP BP
0B76:0215 C3 RET
7E
0B76:056C 55 PUSH BP ;bp-3个字-ss-第一个字的地址-ds-0194-cs-ip-bp
0B76:056D 8BEC MOV BP,SP ;006a
0B76:056F 56 PUSH SI
0B76:0570 57 PUSH DI
0B76:0571 1E PUSH DS ;bp-3个字-ss-第一个字的地址-ds-0194-cs-ip-bp-si-di-ds
0B76:0572 C57606 LDS SI,[BP+06] ;把DS段,[bp+06]里的值送入SI
0B76:0575 C47E0A LES DI,[BP+0A] ;把段地址:偏移地址存到ES I. 该程序中把栈的段送入ES,[bp+0a]的值送入DI
;第一个字的地址送入di
0B76:0578 FC CLD
0B76:0579 D1E9 SHR CX,1 ;ds:si指向的值送入es:di
0B76:057B F3 REPZ
0B76:057C A5 MOVSW
0B76:057D 13C9 ADC CX,CX
0B76:057F F3 REPZ
0B76:0580 A4 MOVSB
0B76:0581 1F POP DS
0B76:0582 5F POP DI
0B76:0583 5E POP SI
0B76:0584 5D POP BP
0B76:0585 CA0800 RETF 0008
|ds | |si | |di | |bp | |IP | |CS |
0BEF:0060 00 00 00 00 66 0B 00 00-00 00 7E 00 12 02 76 0B
|AX | |DS | |AX | |SS | |这开始留3字单元| | bp |
0BEF:0070 94 01 66 0B 78 00 EF 0B-FD 01 76 0B 02 33 00 00
0BEF:0080 FB 52 08 02 EA 02 00 00-4E 00 1B 00 00 00 40 00
0BEF:0090 3F 00 0B 00 00 00 02 00-02 00 01 00 01 00 01 00
0BEF:00A0 3C 09 00 00 00 00 00 00-01 00 00 00 00 00 00 00
0BEF:00B0 01 00 00 00 21 01 00 00-00 02 00 00 00 A5 01 00
0BEF:00C0 00 00 03 00 00 00 E2 01-00 00 00 04 00 00 00 F8
0BEF:00D0 01 00 00 00 05 00 1A 00-FA 01 00 00 18 06 00 00
0B66:0194 72 28 03 3e-a0 01 72 22 b1 04 d3 ef
*/ |
|