实验10.3帮忙看下
assume cs:code,ss:stackstack segment
db 10 dup (0)
stack ends
code segment
start:mov ax,12666
mov bx,stack
mov ds,bx
mov si,0
call dtoc
mov dh,8
mov dl,3
mov cl,2
call show_str
mov ax,4c00h
int 21h
dtoc: push dx
push cx
push ax
push si
push bx
mov bx,0
s0: mov cx,10
mov dx,0 ;除之前把dx置为0什么意思?
div cx
mov cx,ax
jcxz s1
add dx,30h
push dx
inc bx
jmp short s0
s1:add dx,30h
push dx
inc bx
mov cx,bx
mov si,0
s2:pop ax
mov ,al
inc si
loop s2
ay:pop bx
pop si
pop ax
pop cx
pop dx
ret
show_str:push bx
push cx
push si
mov al,0a0h
dec dh
mul dh
mov bx,ax
mov al,2
mul dl
sub ax,2
add bx,ax
mov ax,0b800h
mov es,ax
mov di,0
mov al,cl
mov ch,0
s3: mov cl,ds:
jcxz ok
mov es:,cl
mov es:,al
inc si
add di,2
jmp short s3
ok:pop si
pop cx
pop bx
ret
code ends
end start上面我做有标号那里,dx存放的是高16位数据,为什么在做32位除法前要把dx置为0,我把12666改为0FFFFFFFFH,计算出来的数字就不对了. 我这个问题不对,但小鱼老师视频上说的也不对,他说在程序员不知道数据的值是多少的情况,不能确定循环次数,如果数据的值超过16位,程序员肯定要把16位以上的数据值放入dx中,就是说程序员是一定要知道数据值的.不知道我说的对不对 本帖最后由 kane080824 于 2011-11-28 20:23 编辑
1,小甲鱼老师有时候是会口误,但口误不是原则原理上的错,所以首先是你理解错了,有时候循环知道次数,有时候不知道具体次数,一般知道循环次数可以用loop转移指令,不知道次数就用jcxz或其它一些判断+跳转来实现,因为虽然不知道循环的次数,但知道终止循环的条件
2,dx为什么置0?因为div cx是除数为16位,所以被除数要为32位,高16位在dx中,此程序中被除数大小不超过16位表示范围,所以dx要复位归0
3,你把12666改成0FFFFFFFFH,无非想验证此程序可以显示更大的十进制数,但遗憾的是这个程序的除法有缺陷,因为还没有考虑到除法溢出的可能,而你这个数很大,第一次除以10后的商ax已无法存放产生溢出,所以结果必然不对,请你仔细看实验10.2除法溢出的解决 kane080824 发表于 2011-11-28 20:21 static/image/common/back.gif
1,小甲鱼老师有时候是会口误,但口误不是原则原理上的错,所以首先是你理解错了,有时候循环知道次数,有时候不 ...
有空再继续研究,真是头疼
页:
[1]