实验10.3
本帖最后由 kyod 于 2014-3-9 23:57 编辑鱼油们好,实验10.3还未完成,但是遇到了问题,DEBUG调试了很多了,也没办法找出原因,麻烦大家帮忙看看。
程序1:
assume cs:code,ds:data
data segment
db 24 dup(0)
dw 123,12666,1,8,3,38
dw 6 dup(0)
data ends
code segment
start:mov ax,12666
mov bx,data
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 ax
push bx
push cx
push dx
push ds
push si
mov si,0
s: jcxz ok
mov cx,10
push ax ;把ax值放入内存
mov ax,dx ;把dx值赋予ax
mov dx,0
div cx ;求cx商为ax,余数为dx
mov bx,ax ;bx为dx的值
pop ax ;把ax还原
div cx ;求cx的商,此时dx为余数,ax为cx的商
mov cx,dx ;余数赋予cx
mov dx,bx ;商的高位存放在dx,ax为商的低位
push cx
add cx,48 ;十进制数加48即30H,转化为字符
mov bx,cx ;把转化字符后赋予bx
pop cx
push bx ;把字符入栈
inc si ;记录循环次数
jmp s
ok: mov cx,si
mov si,0
s1: pop ds:
add si,2
loop s1
pop si
pop ds
pop dx
pop cx
pop bx
pop ax
ret
show_str:push ax
push bx
push cx
push dx
push es
push di
push si
push ds
mov si,2
mov bl,cl
mov ax,0b800h
mov es,ax
s3:jcxz ok2
mov al,160
mul dh ;ax为1280
mov di,ax ;di=ax,为1280
mov al,2
mul dl ;dl乘以2,ax为它们的值
add di,ax ;di为显示地址起始
mov ch,0
mov cx,ds:
mov es:,cx ;把数据段的第一字符复制到目标地址
mov byte ptr es:,bl ;把字符颜色改了绿色
add si,2 ;si自增2
inc dl ;dl自增1
jmp s3
ok2:pop ds
pop si
pop di
pop es
pop dx
pop cx
pop bx
pop ax
ret
code ends
end start
运行结果:26358138为什么不是12666?求解。
assume cs:code,ds:data
data segment
db 36h,36h,36h,32h,31h,30h,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
dw 123,12666,1,8,3,38
dw 6 dup(0)
data ends
code segment
start:mov ax,12666
mov bx,data
mov ds,bx
mov si,0
mov dh,8
mov dl,3
mov cl,2
call show_str
mov ax,4c00h
int 21h
show_str:push ax
push bx
push cx
push dx
push es
push bp
push si
push ds
mov bl,cl
s3:jcxz ok2
mov ax,0b800h
mov es,ax
mov al,160
mul dh ;ax为1280
mov bp,ax ;bp=ax,为1280
mov al,2
mul dl ;dl乘以2,ax为它们的值
add bp,ax
mov ch,0
mov cl,byte ptr ds:
mov byte ptr es:,cl ;把数据段的第一字符复制到目标地址
mov byte ptr es:,bl ;把字符颜色改了绿色
inc si ;si自增1
inc dl ;dl自增1
jmp s3
ok2:pop ds
pop si
pop bp
pop es
pop dx
pop cx
pop bx
pop ax
ret
code ends
end start
显示程序show_str没问题,结果:666210
调试计算程序dtoc,结果在数据段ds:,si=0,inc si。36 36 36 32 31 30 .......
求解。。。。。 assume cs:code,ds:data
data segment
db 24 dup(0)
dw 123,12666,1,8,3,38
dw 6 dup(0)
data ends
code segment
start:mov ax,12666
mov bx,data
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 ax
push bx
push cx
push dx
push ds
push si
mov si,0
s: jcxz ok
mov cx,10
push ax ;把ax值放入内存
mov ax,dx ;把dx值赋予ax
mov dx,0
div cx ;求cx商为ax,余数为dx
mov bx,ax ;bx为dx的值
pop ax ;把ax还原
div cx ;求cx的商,此时dx为余数,ax为cx的商
mov cx,dx ;余数赋予cx
mov dx,bx ;商的高位存放在dx,ax为商的低位
push cx
add cx,48 ;十进制数加48即30H,转化为字符
mov bx,cx ;把转化字符后赋予bx
pop cx
push bx ;把字符入栈
inc si ;记录循环次数
jmp s
ok: mov cx,si
mov si,0
s1: pop ds:
add si,2
loop s1
pop si
pop ds
pop dx
pop cx
pop bx
pop ax
ret
show_str:push ax
push bx
push cx
push dx
push es
push di
push si
push ds
mov si,2
mov bl,cl
mov ax,0b800h
mov es,ax
s3:jcxz ok2
mov al,160
mul dh ;ax为1280
mov di,ax ;di=ax,为1280
mov al,2
mul dl ;dl乘以2,ax为它们的值
add di,ax ;di为显示地址起始
mov ch,0
mov cx,ds:
mov es:,cx ;把数据段的第一字符复制到目标地址
mov byte ptr es:,bl ;把字符颜色改了绿色
add si,2 ;si自增2
inc dl ;dl自增1
jmp s3
ok2:pop ds
pop si
pop di
pop es
pop dx
pop cx
pop bx
pop ax
ret
code ends
end start
换了方法,结果还是出不来。到底是哪里出了问题??正确结果应该是12666绿色字体。
debug查了,数据段ds:,0开始:30 00 31 00 32 00 36 00 36 00 36 00......到底是哪里出了问题呢?
以下代码供参考:assume cs:code
data segment
db 10 dup (0)
; 用于存入转换为ASCII码的数据
data ends
code segment
start: mov ax,12666
mov bx,data
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
; 功能:将word型数据转变为表示十进制的字符串,字符串以0为结尾符
; 参数: (ax)=word型数据,ds:si指向字符串首地址
; 返回: 无
dtoc: mov si,8 ; 从存ASCII码数据段倒数第2个字节单元开始,相当于添加结尾符0
s0: mov cx,10
mov dx,00
div cx
add dx,30H ; 余数+30H 得到ASCII码
mov ,dl
mov cx,ax
jcxz break ; 判断商是否为0,如果为0则返回
dec si
inc cx ; 注意在执行loop循环时,先执行的是CX=CX-1,然后判断CX是否为0
loop s0
break: ret
show_str: mov ax,0B800H
mov es,ax
mov di,0
mov al,0A0H
mul dh
add di,ax
mov al,2
mul dl
add di,ax
mov bl,cl
s: mov cl,
mov ch,0
jcxz ok
mov es:,cl
mov es:,bl
add di,2
inc si
loop s
ok: ret
code ends
end start 小甲鱼 发表于 2014-3-9 16:08 static/image/common/back.gif
以下代码供参考:
谢谢甲鱼老师。 看不懂啊,也太高大上了吧
页:
[1]