虽然有点复杂,寄存器也用的有点多,但确实是完整的
data segment
db 100 dup(0)
data ends
stack segment
dw 8 dup(0)
stack ends
code segment
assume cs:code,ds:data,ss:stack
;*********************************************************************************
参数:ax 传入要输出的值
;************
PRINTSTRING: ;*************
将用到的寄存器压栈
push ax
push bx
push cx
push dx
push si
push di
push es
;*************
mov bx,10 ;得到一串ascii码。注意是倒叙的,接下来大部分代码都是完成正序输出的
mov di,0
k:mov cx,ax
jcxz JGETN
mov dx,0
div bx
add dl,'0'
mov [di],dl
inc di
jmp short k
;*************
JGETN:mov si,0 ;完成统计字符串中字符个数(不含结束符0),si指向字符串首地址;al统计个数
mov al,0
GETN: mov cl,[si]
mov ch,0
jcxz PRINT
inc al
inc si
jmp short GETN
;*************
PRINT:mov ah,0 ;在输出之前设置各个寄存器的值以打印
mov si,ax
dec si
mov cx,ax
mov ax,0b800H
mov es,ax
mov di,0
;*************
;开始输出,从最后一个字符开始,依次向前
P:mov al,[si]
mov ah,00000111B
mov es:[di],ax
add di,2
dec si
loop P
return: ;*************
将用到的寄存器出栈
push es
push di
push si
push dx
push cx
push bx
push ax
;*************
ret ;返回主程序
;*********************************************************************************
start:
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,10H
mov ax,12666
call PRINTSTRING ;得到这个整数的ascii码并写到data段中
mov ah,4ch
int 21h
code ends
end start |