|
发表于 2015-4-20 23:17:18
|
显示全部楼层
本帖最后由 KTMONREK 于 2015-4-21 08:58 编辑
- assume cs:code,ss:stack,ds:data
- data segment
- db 'Welcome to masm!',0 ;这是你的代码,下面我注释的地方为错误的地方
- data ends
- stack segment
- db 16 dup(0)
- stack ends
- code segment
- start:mov dh,8
- mov dl,3
- mov cl,2
- mov ch,0
- mov ax,data
- mov ds,ax
- mov si,0
- mov ax,stack
- mov ss,ax
- mov sp,16
- mov ax,0b800h
- mov es,ax
- push cx
- mov bh,0
- mov bl,dh
- sub bx,1
- mov ch,0
- mov cl,dl
- sub cx,1
- mov ah,0
- mov al,0a0h
- mul bl
- mov bp,ax
- mov ah,0
- mov al,2
- mul cl
- add bp,ax
- mov di,bp
- inc di
- pop cx
- call show_str
- mov ax,4c00h
- int 21h
- show_str:push cx ;!!!注意!!!
- mov ch,0
- mov cl,byte ptr ds:[si]
- jcxz result ;当(cx)=0的时候,跳到result
- mov al,ds:[si]
- mov es:[bp],al
- inc si
- add bp,2
- pop cx
- mov es:[di],cl
- add di,2
- jmp near ptr show_str
- result:ret ;注意这里,你直接就ret的话,程序会跳到cs:0002的地址处执行
- ;因为此时栈顶指针指向的是你push cx的值,即0002h,并不是call语句的下一条指令地址
- ;更改如下:
- code ends ;result: pop cx
- ; ret
- end start ;这样才会跳回call后面的指令
复制代码
|
|