asm16 显示长整形 123456789
; 写的比较仓促 仅供参考assume cs:code
data segment
dd 123456789
nstr db 10h dup (0)
data ends
stack segment
dw 100h dup (0)
stack ends
code segment
_end:mov ax,4c00h
int 21h
; 除法溢出函数
; 调用该函数前请自行保存 si
; 除数 ax,dx / 被除数 cx
; 余数保存到:si
div_over:
xor si,si
test dx,dx
jz _div
push ax
mov ax,dx
xor dx,dx
div cx
mov si,ax
pop ax
_div:
div cx
push dx
mov dx,si
pop si
retn
; 整形转字符串
; 参数:字符保存位置,低16位,高16位
ntostr:
push bp
mov bp,sp
push cx
push dx
push bx
push si
xor cx,cx
mov ax,
mov dx,
n_next:
push cx
mov cx,0ah
call div_over
pop cx
inc cx
add si,30h
push si
test dx,dx
jnz n_next
test ax,ax
jnz n_next
mov bx,
xor si,si
n_addstr:
pop ax
mov ,al
inc si
loop n_addstr
mov byte ptr ,0; thanks ngm20
pop si
pop bx
pop dx
pop cx
mov sp,bp
pop bp
retn
; 显示字符串
; 参数:字符串地址,字符位置
show_str:
push bp
mov bp,sp
push si
push di
push bx
mov al,
mov cl,80*2
mul cl
mov si,ax
xor ax,ax
mov al,
add ax,ax
add si,ax
mov ax,0b800h
mov es,ax
mov bx,
xor di,di
mov ah,2
s_add:
mov al,
test al,al
jz s_over
mov es:,ax
inc di
add si,2
jmp s_add
s_over:
pop bx
pop di
pop si
mov sp,bp
pop bp
retn
start:jmp _start
db 'Code By: Nisy/PYG ',0
_start:
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,200h
; 将整形转化为字符串 保存到nstr中
xor bx,bx
mov ax,
push ax
lea bx,
mov ax,
push ax
lea ax,nstr
push ax
call ntostr
add sp,6
; 显示nstr的数值
mov ax,0a0ah
push ax
lea ax,nstr
push ax
call show_str
add sp,4
; 程序结束
jmp _end
code ends
end start
本帖最后由 Finder 于 2011-1-7 10:27 编辑
站位学习,慢慢消化
学习消化了一下,写完之后看看,和楼主的差距还是很大,继续学习,还是把部分代码贴出来了,
data segment
num1dd 987654321
.....................
data ends
..............................
mov bx,offset num1
mov ax,
mov dx,
call divcx
.............................. divcx proc ;参数传递用dx:ax
movbp,sp
subsp,20h
pushbp
movbp,sp
addbp,2
push cx
push bx
push si
pushbp
;以上初始化
mov cx,0ah
mov si,0
callntostr
nop
pop bx
dec bx
;设传递字节的结束偏移地址
addbp,si
decbp
movsi,offset chr
_movsb: moval,
movbyte ptr ds:,al
incsi
decbp
cmpbp,bx
jnz_movsb
movbyte ptr ds:,24h ;设置显示字符串结束标识
popsi
popbx
popcx
popax
movsp,ax ;平衡堆栈
retn
ntostr: test dx,dx
jz _div1
push ax
mov ax,dx
xor dx,dx
div cx
mov bx,ax
pop ax
_div1: div cx
add dx,30h
mov ,dx ;将余数+30h存放在临时变量中
inc si
mov dx,bx
test ax,ax
jnz ntostr
retn
;--------------------------------
divcx endp xor bx,bx
mov ax,
push ax
lea bx,
mov ax,
这段好绕人啊,N大这样写是为了减小机器码长度? lea bx,
mov ax, //等价于 mov ax,这里用 lea 做了一个加法 小把戏 ntostr子程序 对栈和cx的应用很精彩:lol:
输出字符时判断结束是看该位是否为零
老大在定义nstr db 10h dup (0)全为零,所以实现上肯定没有问题
感觉程序严谨些可以在74行加一句
mov ,0 作为结束的标志 想到一块了 我打算晚上视频加呢 O(∩_∩)O~ 74行没加 mov ,0 作为结束的标志而且程序能正常运行,是因为一开始 nstr db 10h dup (0)
正好是定义的0,所以 108 109行正常运行。
页:
[1]