本帖最后由 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后面的指令
|