汇编的一个问题
代码:assumecs:codedatasegmentdb10dup(0)dataendsstacksegmentdw8(0)stackendscodesegmentst...
代码:
assume cs:code
data segment
db 10 dup(0)
data ends
stack segment
dw 8(0)
stack ends
code segment
start:mov ax,12666 ;把要显示的10进制数据存入ax
mov bx,data
mov ds,bx
mov bx,stack
mov ss,bx
mov sp,16
mov si,0
call dtoc
mov si,0 ;将si清零
mov cx,0 ;将cx清零
mov dh,8
mov dl,3
mov cl,2
call show_str
mov ax,4c00h
int 21h
dtoc:push dx
push ax
push cx
push bx
push di
mov bx,0 ;bx中记录循环的次数,
mov di,10
mov dx,0
s1: inc bx ;除一次bx就加1
div di
push dx ;将除的余数入栈,即算出10进制数每位的ascII码
mov cx,ax
jcxz s5 ;检查商是否为0,如果为0就停止除10,并跳到显示函数
jmp short s1
s5:mov cx,bx ;将总共压入栈的余数的个数存入到cx
s2:dec cx ;把余数出一次栈,就cx减1
jcxz s3 ;检查cx是否为0,为0则返回
pop ax
add al,30h
mov [si],al ;将余数转换成对应的askII,并送入到数据单元中
inc si
jmp short s2
s3:mov byte ptr [si+1],0
pop di
pop bx
pop cx
pop ax
pop dx
ret
show_str:
push bx
push es
push ax
mov ch,0
push cx ;将后面用的寄存器压入栈
mov ax,0b800h
mov es,ax ;将显存VGA模式区域段地址送入es中
sub dh,1
mov al,dh
mov bl,0a0h
mul bl ;将需显示VGA区域偏移地址送入ax,即显示行地址在这里已确定
mov dh,0
add dl,dl
add ax,dx
mov bx,ax ;将显示区域的列地址存到bx中
pop cx
mov al,cl ;从栈取出cx放入到al,因为下面需要cl作为显示字体属性
s4:
mov cl,[si]
mov ch,0 ;将data中的一个字节送入cx中
jcxz s8
mov dl,[si]
mov es:[bx],dl ;将字符送入到显示地址中
mov es:[bx+1],al ;将显示字体属性送入紧接着的显示区域
inc si
add bx,2
jmp short s4
s8:pop ax
pop es
pop bx
ret ;取出压入栈中的数据,并返回
code ends
end start
各位可以帮忙debug下,到mov bx,0就会出错。。。不知道是为什么,另外程序也没显示结果(此程序功能将12666以字符窜形式输出 展开
assume cs:code
data segment
db 10 dup(0)
data ends
stack segment
dw 8(0)
stack ends
code segment
start:mov ax,12666 ;把要显示的10进制数据存入ax
mov bx,data
mov ds,bx
mov bx,stack
mov ss,bx
mov sp,16
mov si,0
call dtoc
mov si,0 ;将si清零
mov cx,0 ;将cx清零
mov dh,8
mov dl,3
mov cl,2
call show_str
mov ax,4c00h
int 21h
dtoc:push dx
push ax
push cx
push bx
push di
mov bx,0 ;bx中记录循环的次数,
mov di,10
mov dx,0
s1: inc bx ;除一次bx就加1
div di
push dx ;将除的余数入栈,即算出10进制数每位的ascII码
mov cx,ax
jcxz s5 ;检查商是否为0,如果为0就停止除10,并跳到显示函数
jmp short s1
s5:mov cx,bx ;将总共压入栈的余数的个数存入到cx
s2:dec cx ;把余数出一次栈,就cx减1
jcxz s3 ;检查cx是否为0,为0则返回
pop ax
add al,30h
mov [si],al ;将余数转换成对应的askII,并送入到数据单元中
inc si
jmp short s2
s3:mov byte ptr [si+1],0
pop di
pop bx
pop cx
pop ax
pop dx
ret
show_str:
push bx
push es
push ax
mov ch,0
push cx ;将后面用的寄存器压入栈
mov ax,0b800h
mov es,ax ;将显存VGA模式区域段地址送入es中
sub dh,1
mov al,dh
mov bl,0a0h
mul bl ;将需显示VGA区域偏移地址送入ax,即显示行地址在这里已确定
mov dh,0
add dl,dl
add ax,dx
mov bx,ax ;将显示区域的列地址存到bx中
pop cx
mov al,cl ;从栈取出cx放入到al,因为下面需要cl作为显示字体属性
s4:
mov cl,[si]
mov ch,0 ;将data中的一个字节送入cx中
jcxz s8
mov dl,[si]
mov es:[bx],dl ;将字符送入到显示地址中
mov es:[bx+1],al ;将显示字体属性送入紧接着的显示区域
inc si
add bx,2
jmp short s4
s8:pop ax
pop es
pop bx
ret ;取出压入栈中的数据,并返回
code ends
end start
各位可以帮忙debug下,到mov bx,0就会出错。。。不知道是为什么,另外程序也没显示结果(此程序功能将12666以字符窜形式输出 展开
1个回答
展开全部
stack segment
dw 8(0) ;这里有问题,少了dup
stack ends
但关键是debug执行命令的时候会用到程序的栈空间.
你设定的段只有16字节,最后一个push di后,debug程序使用栈的时候出错了.
把stack设置成更大的空间(dw 20 dup(0));mov sp,16改成更大的值比如40
程序可以正常工作.
这种情况具体是debug误改了自己的有用信息还是越界操作等等具体的问题就没分析了..现在睡觉先...
dw 8(0) ;这里有问题,少了dup
stack ends
但关键是debug执行命令的时候会用到程序的栈空间.
你设定的段只有16字节,最后一个push di后,debug程序使用栈的时候出错了.
把stack设置成更大的空间(dw 20 dup(0));mov sp,16改成更大的值比如40
程序可以正常工作.
这种情况具体是debug误改了自己的有用信息还是越界操作等等具体的问题就没分析了..现在睡觉先...
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询