ISHEEPI 发表于 2020-10-11 15:21:57

汇编 实验10 的 第三个 进制转换显示

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 ;除以10
        mov ,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: ;将数据拿出
                add al,30h   ;加30h
                mov es:,al ;放入显存
                mov es:,dl ;放入字体样式
                add di,2         ;偏移加2
                dec si         ;数据下一个
        loop s
ret

codesg ends

end start

debug 的时候可以结束 但没显示12666
直接运行会卡住
求大神解答

ISHEEPI 发表于 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 ,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 ;除以10
      mov ,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: ;将数据拿出
                add al,30h   ;加30h
                mov es:,al ;放入显存
                mov es:,dl ;放入字体样式
                add di,2         ;偏移加2
                dec si         ;数据下一个
      loop s
ret

codesg ends

end start

这个是最后可以成功的

xieglt 发表于 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 ,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 ,dl ;余数放入 数据段
      test ax,ax
      jz ok
      jmp short dtoc ;循环
ok:ret            ;为零结束

codesg ends

end start

wtchou 发表于 2020-10-12 13:13:16

本帖最后由 wtchou 于 2020-10-13 07:30 编辑

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

这部份改一下

ISHEEPI 发表于 2020-10-13 20:54:42

wtchou 发表于 2020-10-12 13:13
dtoc:
        mov dx,0
      div bx


不好意思 改成你这样还是不行 不过还是很谢谢你
我已经找到问题了
我想用 ds:【bx】来做除数0ah , 但我上面没放进去

川建军 发表于 2020-10-18 21:22:38

为啥我的汇编通过不了,nasm和masm的区别很大吗

川建军 发表于 2020-10-19 13:25:40

ISHEEPI 发表于 2020-10-19 07:56
assume cs:codesg

data segment


nasm是不是没有assum伪指令啊

ISHEEPI 发表于 2020-10-19 18:36:39

川建军 发表于 2020-10-19 13:25
nasm是不是没有assum伪指令啊

我没用过nasm 你可以查查两个的区别
页: [1]
查看完整版本: 汇编 实验10 的 第三个 进制转换显示