除法,要用32位除以16位,16位除以8位的话,会溢出。
余数存放下来,还要进行逆序操作。
assume cs:code
data segment
db 10 dup(0)
data ends
stack segment
db 16 dup(0)
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,1ah
mov ax,65535
mov bx,data
mov ds,bx
mov si,0
call dtoc
mov si,0
call nixu
mov dh,8
mov dl,3
mov cl,2
mov si,0
call show_str
mov ax,4c00h
int 21h
dtoc: mov ch,0
mov bx,10
s: mov dx,0 ;防止溢出,用32位除以16位
div bx
or dl,30h
mov [si],dl
inc si
mov cx,ax
jcxz ok
mov ax,cx
jmp short s
ok: ret
nixu: mov ch,0 ;将余数逆序存放
s1: mov cl,[si]
jcxz ok1
push cx
inc si
jmp s1
ok1: mov di,0
mov cx,si
s2: pop ax
mov [di],al
inc di
loop s2
ret
show_str:
push ax
push bx
push cx
push dx
push si
push es
dec dh ;行号减一
mov al,0a0h
mul dh ;0a0h*(行号-1)
mov dh,0
dec dl
add dx,dx ;2*(列号-1)
add ax,dx ;0a0h*(行号-1)+2*(列号-1)
mov bx,ax
mov ch,0 ;ch清零,为cx进栈(颜色)做准备
mov ax,0b800h
mov es,ax ;显存段地址
s3: push cx ;颜色进栈
mov cl,[si] ;取出一个字符
jcxz ok2 ;是零则返回
mov es:[bx],cl ;不是零,放显存相应单元
inc bx
pop cx ;取回颜色
mov es:[bx],cl ;存颜色
inc bx
inc si
jmp short s3 ;修改指针并循环
ok2: pop cx ;返回前,将刚才进栈的cx出栈,使栈顶指针指向返回地址
pop es
pop si
pop dx
pop cx
pop bx
pop ax
ret
code ends
end start
做了课设1,才惊觉怎么这个题目没有用第二题的子程序?!
- [游客] 感谢 11/15 22:10
- [游客] 把:DD 5937000,改成:DD 4294967295,你的错误,立刻就暴露出来。呵呵 05/19 18:30
- [游客] 计算人均时,是DD型除以DW型。把DD型的最大值代进去,你的程序,就溢出了。 05/19 18:28
- [游客] 注意不溢出的除法。 05/19 18:25
- [游客] 老师好啊~ 06/28 11:01
- [longphui] 谢谢 09/03 20:10
- [longphui] 谢谢 09/03 16:23
- [longphui] 谢谢 09/02 15:26
- [longphui] 谢谢 09/02 09:13
- [sissim] 恩恩,谢谢指正 01/11 18:24
- [even3] 亲,你好。。。这边有一个汇编语言程序,但是就是不知道哪里出了问题,问了很多人,都不知道想麻烦您一下, 05/16 20:48
- [mcjfo] 楼主可以帮我解决这个问题吗?谢谢! 为什么它会跳过JMP DD 指令不执行啊 小弟搞了好久抖没 06/08 06:50