当前位置: 代码迷 >> 汇编语言 >> 一个奇怪的有关问题,小弟搞了几天了,还是没找到有关问题
  详细解决方案

一个奇怪的有关问题,小弟搞了几天了,还是没找到有关问题

热度:1901   发布时间:2013-02-26 00:00:00.0
一个奇怪的问题,小弟搞了几天了,还是没找到问题
跟踪程序的时候,下面语句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
  相关解决方案