鱼C论坛

 找回密码
 立即注册
查看: 3029|回复: 7

[已解决]汇编 实验10 的 第三个 进制转换显示

[复制链接]
发表于 2020-10-11 15:21:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
assume cs:codesg

data segment
        db 10 dup(0)
data ends

codesg segment

start:
        mov ax,12666
        mov bx,data
        mov ds,bx; 数据段
       
        mov si,0
        mov bx,0ah
        mov cx,ax;通过ax是否为零来判断数字 是否转换完
       
        call dtoc ;将数字转换为10进制
       
        mov dh,8
        mov dl,3
        mov cl,2
        call show_str ;放入显存
       
        mov ax,4c00h
        int 21h

dtoc:
        div word ptr [bx];除以10
        mov [si],dl;余数放入 数据段
        mov dx,0   ;清空余数
        mov cx,ax  ;判断是否为0
        jcxz ok
        inc si     ;数据段下一个位置
        jmp short dtoc ;循环
ok:ret;为零结束

show_str:
       
        mov al,2
        mul dl
        sub al,2
        mov dl,al;dl 里存放列偏移
       
        mov al,0a0h
        dec dh
        mul dh ;al存放行偏移
        add al,dl;ax存放 偏移
       
        mov di,ax;di 存放显存偏移
       
        mov dx,cx;dx  存放字体样式
       
        mov cx,5;循环次数
       
        mov ax,0b800h
        mov es,ax;显存
       
        s:
                mov al,ds:[si] ;将数据拿出
                add al,30h     ;加30h
                mov es:[di],al ;放入显存
                mov es:[di+1],dl ;放入字体样式
                add di,2         ;偏移加2
                dec si           ;数据下一个
        loop s
ret

codesg ends

end start

debug 的时候可以结束 但没显示12666
直接运行会卡住
求大神解答
最佳答案
2020-10-12 10:01:51
本帖最后由 xieglt 于 2020-10-12 10:11 编辑
assume cs:codesg

data segment
        db 10 dup(0)
data ends

codesg segment

start:
        mov ax,12666
        mov bx,data
        mov ds,bx ; 数据段
       
            ;12666先存个位的6,最后存万位的1,因此从后向前处理
        mov si,10
        MOV [SI],36   ;DOS输出结束符号
        mov bx,0ah
 
        call dtoc ;将数字转换为10进制
                
                ;调用DOS 9号功能输出字符串
                mov ah,9
                mov dx,si
                int 21h ;
       
        mov ax,4c00h
        int 21h

dtoc:
                dec si
                ;除法 dx:ax / bx 商进AX,余数进DX
        xor dx,dx
        div bx
                
                ;10进制数转换成ASCII码才能输出
                add dl,30H
        mov [si],dl ;余数放入 数据段
        test ax,ax
        jz ok
        jmp short dtoc ;循环
ok:ret              ;为零结束

codesg ends

end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-10-19 07:56:40 | 显示全部楼层
本帖最后由 ISHEEPI 于 2020-10-19 08:02 编辑
川建军 发表于 2020-10-18 21:22
为啥我的汇编通过不了,nasm和masm的区别很大吗

assume cs:codesg

data segment
        db 10 dup(0)
data ends

codesg segment

start:
        mov ax,12666
        mov bx,data
        mov ds,bx; 数据段
        mov bx,20;
        mov si,0
        mov word ptr [bx],0ah
        mov cx,ax;通过ax是否为零来判断数字 是否转换完
        
        call dtoc ;将数字转换为10进制
        
        mov dh,8
        mov dl,3
        mov cl,2
        call show_str ;放入显存
        
        mov ax,4c00h
        int 21h

dtoc:
        mov dx,0   ;清空余数
        div word ptr [bx];除以10
        mov [si],dl;余数放入 数据段
        mov cx,ax  ;判断是否为
        jcxz ok
        inc si     ;数据段下一个位置
        jmp short dtoc ;循环
ok:ret;为零结束

show_str:
        
        mov al,2
        mul dl
        sub al,2
        mov dl,al ;dl 里存放列偏移
        
        mov al,0a0h  ;行偏移乘以160
        dec dh
        mul dh    ;al存放行偏移
        add al,dl ;ax存放 偏移
        
        mov di,ax;di 存放显存偏移
        
        mov dx,cx;dx  存放字体样式
        
        mov cx,5;循环次数
        
        mov ax,0b800h
        mov es,ax;显存
        
        s:
                mov al,ds:[si] ;将数据拿出
                add al,30h     ;加30h
                mov es:[di],al ;放入显存
                mov es:[di+1],dl ;放入字体样式
                add di,2         ;偏移加2
                dec si           ;数据下一个
        loop s
ret

codesg ends

end start

这个是最后可以成功的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-12 10:01:51 | 显示全部楼层    本楼为最佳答案   
本帖最后由 xieglt 于 2020-10-12 10:11 编辑
assume cs:codesg

data segment
        db 10 dup(0)
data ends

codesg segment

start:
        mov ax,12666
        mov bx,data
        mov ds,bx ; 数据段
       
            ;12666先存个位的6,最后存万位的1,因此从后向前处理
        mov si,10
        MOV [SI],36   ;DOS输出结束符号
        mov bx,0ah
 
        call dtoc ;将数字转换为10进制
                
                ;调用DOS 9号功能输出字符串
                mov ah,9
                mov dx,si
                int 21h ;
       
        mov ax,4c00h
        int 21h

dtoc:
                dec si
                ;除法 dx:ax / bx 商进AX,余数进DX
        xor dx,dx
        div bx
                
                ;10进制数转换成ASCII码才能输出
                add dl,30H
        mov [si],dl ;余数放入 数据段
        test ax,ax
        jz ok
        jmp short dtoc ;循环
ok:ret              ;为零结束

codesg ends

end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-12 13:13:16 | 显示全部楼层
本帖最后由 wtchou 于 2020-10-13 07:30 编辑

dtoc:
        mov dx,0
        div bx
        mov [si],dl
        mov cx,ax
        jcxz ok
        inc si
        jmp short dtoc
ok:ret

这部份改一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-13 20:54:42 | 显示全部楼层
wtchou 发表于 2020-10-12 13:13
dtoc:
        mov dx,0
        div bx

不好意思 改成你这样还是不行 不过还是很谢谢你
我已经找到问题了
我想用 ds:【bx】来做除数0ah , 但我上面没放进去
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-18 21:22:38 | 显示全部楼层
为啥我的汇编通过不了,nasm和masm的区别很大吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-19 13:25:40 | 显示全部楼层
ISHEEPI 发表于 2020-10-19 07:56
assume cs:codesg

data segment

nasm是不是没有assum伪指令啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-19 18:36:39 | 显示全部楼层
川建军 发表于 2020-10-19 13:25
nasm是不是没有assum伪指令啊

我没用过nasm 你可以查查两个的区别
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-28 19:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表