|
发表于 2013-10-26 15:39:25
|
显示全部楼层
本帖最后由 skyonline 于 2013-10-26 23:53 编辑
ASSUME CS:code,DS:data ;程序说明: 把code段 6个字节数据传入(倒序) data段
data SEGMENT
DW 0000h,0000h,0000h
data ENDS
code SEGMENT
DW 874ah,1444h,5641h
start:
MOV AX,data
MOV DS,AX
MOV AX,CS
MOV SS,AX
MOV SP,0006 ;此处改成4
MOV BX,6 ;此处改成0
MOV CX,3
for:
POP [BX]
ADD BX,2
LOOP for
MOV BX,2 ;这两句话我没看懂,但是如果只是传递数据可以删掉
MOV BX,[BX]
MOV AX,4c00h
INT 21h
code ENDS
END start
注意:此程序是·不·能·单·步·跟·踪·的,否则在debug当中会在cs:ip入栈时会把code段的数据(874a等)覆盖掉
还有一点很重要的是出栈的操作顺序是①先把数据移入目标②之后sp = sp+2所以sp初值应设成4。如果想要单步跟踪的话就像楼上的说法一样,使用寄存器间接写入,毕竟debug过程是必须用到入栈的。
这里给你一段按照楼上思路的可行代码- ASSUME CS:code,DS:data ;程序说明: 把code段 6个字节数据传入(倒序) data段
- data SEGMENT
- DW 0000h,0000h,0000h
- data ENDS
- code SEGMENT
- DW 874ah,1444h,5641h
- start:
- mov ax,data
- mov ds,ax
- mov ax,code
- mov es,ax
- xor bx,bx
- mov si,4 ;word ptr ds:[4] = 5641h
- mov cx,3
-
- s: mov ax,es:[si]
- mov [bx],ax
- add bx,2
- sub si,2
- loop s
-
- mov ax,4c00h
- int 21h
- code ends
- end start
-
复制代码
ps:在帖子里给代码排版真蛋疼……
|
|