|
10鱼币
本帖最后由 枫叶情 于 2014-7-15 02:49 编辑
汇编实验10(3)没用正常结束,求大神帮忙解决。谢谢!
代码:
assume cs:code, ds:data
data segment
db 10 dup (0)
data ends
code segment
start: mov ax, 12666
mov bx, data
mov ds, bx
mov si, 0
call dtocl
mov dh, 8 ;设置显示的行
mov dl, 3 ;设置显示的列
mov cl, 4 ;设置颜色为红色
mov di, 0 ;将目标偏移地址置0
call show
mov ax, 4c00h
int 21h
show:
mov ax, 0b800h ;设置显存地址
mov es, ax ;将显存的地址给es
mov ax, 160 ;每行的有160字节
mul dh ;乘以dh得到行
mov bx, ax ;将行给目标偏移地址
mov ax, 2 ;两个字节为一列
mul dl ;乘以dl得到列
add bx, ax ;将列加入到目标偏移地址锁定行跟列的偏移地址
mov al, cl
mov cl, 0
s1: mov ch, [si] ;将源地址中的ascii码给到显存的偏移地址
jcxz return
mov es:[bx], ch
mov es:[bx+1], al ;设置显示的属性
inc si
add bx, 2
loop s1
return: ret
dtocl: push ax
push bx
push cx
push dx
push si
push di ;将寄存器的值保存避免子程序影响主程序
mov bx, 0 ;用作记位数
d1: mov cx, 0ah
mov dx, 0 ;高位置0
div cx ;除以10
mov cx, ax ;判断商是否为0
jcxz d2 ;如果为0则跳转到d2
add dx, 30h ;将余数加上30变为ascii码
push dx
inc bx ;bx递增1 用作计数
jmp short d1
d2: add dx, 30h ;将商为0的余数变为ascii码
push dx
inc bx
mov cx, bx ;将位数给cx用作循环次数
mov si, 0
d3: pop ax ;取出栈中的数据
mov ds:[si], al ;将低位给目标位置
inc si ;目标偏移地址加1
loop d3
ok: pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret
code ends
end start
|
-
cl的值在跳转后改变
-
结果
最佳答案
查看完整内容
把show子程序中的 loop s1 改为jmp s1就行了
|