跟踪程序的时候,下面语句debug的情况如下,这里用的是汇编自带的栈
;在堆栈上开辟8个字节
mov word ptr [bp-8-6],di ;di=c6aeh ?????????问题就出在这里
mov word ptr [bp-8-8],si ;si=a155h ?????????问题就出在这里
debug的结果和堆栈结构如下
AX=0003 BX=000A CX=0000 DX=C6AE SP=FFF2 BP=FFFA SI=A155 DI=C6AE
DS=1405 ES=13F5 SS=1405 CS=1406 IP=007B NV UP EI PL NZ NA PE NC
1406:007B 897EF2 MOV [BP-0E],DI SS:FFEC=007B
-t
AX=0003 BX=000A CX=0000 DX=C6AE SP=FFF2 BP=FFFA SI=A155 DI=C6AE
DS=1405 ES=13F5 SS=1405 CS=1406 IP=007E NV UP EI PL NZ NA PE NC
1406:007E 8976F0 MOV [BP-10],SI SS:FFEA=FFFA
-t
AX=0003 BX=000A CX=0000 DX=C6AE SP=FFF2 BP=FFFA SI=A155 DI=C6AE
DS=1405 ES=13F5 SS=1405 CS=1406 IP=0081 NV UP EI PL NZ NA PE NC
1406:0081 59 POP CX
-d ss:FFEA
1405:FFE0 FA FF 81 00 06 14 ......
1405:FFF0 FB 0D 00 00 00 00 B0 00-00 00 00 00 0C 00 00 00 ................
为什么 DI和SI的内容mov道堆栈中的是 0081 和 FFFA 而不是DI=C6AE和SI=A155 百思不得奇解
下面我把源代码帖出来
- Assembly code
;把由十进制ascii码组成的字符串转化为对应的数值;过程SUBC通过堆栈传递入口参数,通过堆栈传递出口参数assume cs:code,ds:datadata segment source db '3333333333',0 dest db 0,0,0,0,'$' ;结果用四字节存放data endscode segment start: mov ax,data mov ds,ax mov bx,offset source push bx call SUBC pop word ptr dest pop word ptr dest+2 add sp,6 mov ax,4c00h int 21h ;程序名:GETSTRLEN ;功能:取缓冲区中以0结尾的字符串长度 ;入口参数: bx存放ascii源字符串的偏移地址 ;出口参数: cx存放长度 GETSTRLEN proc push ax push bx ;取字符串长度,放入cx中 xor cx,cxGETSTRLEN1: mov al,[bx] or al,al jz GETSTRLEN2 inc bx inc cx jmp GETSTRLEN1GETSTRLEN2: pop bx pop ax retGETSTRLEN endp ;程序名:MUL32X16 ;功能32位乘以16位,结果为32位 ;入口参数: 被乘数 dx高位 ax低位 ,乘数 bx ;出口参数: dx高位 ax低位 MUL32X16 proc push si push di xor si,si xor di,di mov di,dx mov si,ax mov ax,si mul bx push dx push ax mov ax,di mul bx pop si pop di add di,ax mov dx,di mov ax,si pop di pop si ret MUL32X16 endp ;程序名:SUBC ;功能:把由十进制ascii码组成的字符串转化为对应的数值 ;入口参数: 堆栈中存放ascii源字符串的偏移地址 ;出口参数: 堆栈中用4个字节存放转化后的结果 SUBC proc push bp mov bp,sp push bx push cx push si push di mov bx,[bp+4] call GETSTRLEN xor si,si xor di,di SUBC1: push bx mov dx,di mov ax,si mov bx,10 call MUL32X16 mov di,dx mov si,ax pop bx xor ah,ah mov al,[bx] sub al,30h add si,ax adc di,0 inc bx loop SUBC1 ;在堆栈上开辟8个字节 mov word ptr [bp-8-6],di ;di=c6aeh ?????????问题就出在这里 mov word ptr [bp-8-8],si ;si=a155h ?????????问题就出在这里 pop cx pop bx pop di pop si pop [bp-8-4] ;弹出原bp pop [bp-8-2] ;弹出IP ;输出参数放到输入参数ascii串的上面 ;堆栈结构 ; ;|原BP | <- bp ;|IP | ;|低位 | ;|高位 | ;|ascii串首地址| push [bp-8-6] ;压di push [bp-8-8] ;压si push [bp-8-2] ;压IP push [bp-8-4] ;压原bp add bp,4 mov sp,bp pop bp ret ret SUBC endp ;程序名:SUBD ;功能:把由十进制ascii码组成的字符串转化为对应的数值 ;入口参数: 堆栈中存放ascii源字符串的偏移地址和转化后的字节的偏移地址 ;出口参数: 堆栈中存放转化后字节的偏移地址 SUBD proc ret SUBD endp code endsend start