鱼C论坛

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

[汇编作业] 实验10.3大佬来看看为啥没有显示

[复制链接]
发表于 2022-12-31 14:20:21 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 LPY0204 于 2022-12-31 14:22 编辑

assume cs:code   ;将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 dtoc
                 mov si,0
                 mov dh,8 ;定义显示在屏幕第8行
                 mov dl,3 ;定义显示在屏幕第3列
                 mov cl,2 ;定义显示为绿色字            
                 call show
                 mov ax,4c00h
                 int 21h

              dtoc:
                 mov dl,10
                 s0:
                 div dl ;商存在al中,余数存在ah中
                 mov cl,al ;al给cl判断cx是否为0
                 add ah,30h
                 mov [si],ah ;将余数存放到data中
                 jcxz ok1
                 inc si
                 jmp short s0
                 ok1:ret
               

              show:                           
                 mov ax,0b800h  ; 把显存地址给es
                 mov es,ax
                 mov ax,160  ;显示每行为160字节
                 mul dh ;行数乘字节=整字节数
                 mov di,ax ;结果给di
                 mov ax,2 ;每字=两个字节去乘列数
                 mul dl  ;这里面是列数,结果乘完放在ax里
                 add di,ax  ;加上总字节数=偏移地址
                 mov bl,cl ;将cl值给bl便于下面比较cx是否为0
                  
                s:mov cl,[si] ;把data段内的字符串给它
                  jcxz ok ;看cx是否为0,为0即跳转至ok处

                  mov es:[di],cl
                  mov es:[di+1],bl ;把绿色写在字节里
                  inc si
                  add di,2
                  jmp short s

            ok:ret

code ends
end start                        
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-12-31 15:54:45 | 显示全部楼层
本帖最后由 人造人 于 2022-12-31 16:51 编辑

错的地方有点多
12666 / 10 等于多少?
等于1266,余数是6,没问题吧?
al寄存器最大可以存储0xff没问题吧?
1266是多少?
是0x4f2
al能放下这么大的数吗?

学汇编语言你要能用自己的大脑执行汇编指令
在你执行div dl之后是个什么情况?
用ax中的12666除以dl中的10,这会发生什么?
执行完这条指令的结果是什么?你不知道这条指令的执行结果,你怎么能写出这条指令呢?
只有你知道这条指令的结果,你才能写这条指令

是的,写程序不是 你写出程序,然后让计算机执行出结果
应该是 你先用自己的大脑写出程序,然后用自己的大脑执行出结果,然后再把程序用计算机写出来,然后用计算机执行
不要把顺序弄错了

还有jcxz,你在执行jcxz之前和之后,大脑中是个什么状态?
还有,除完之后的字符串是正序的还是反序的?

用你的大脑执行这些指令,这是学汇编语言必备的技能

另一个非常非常非常重要的是
把代码格式弄好,你自己看着舒服,别人看着也舒服
何乐而不为呢?

  1. ; 将data段内字符串显示在屏幕指定位置

  2. assume cs:code

  3. data segment
  4.     db 10 dup(0)
  5. data ends

  6. code segment
  7. start:
  8.     mov ax, 12666
  9.     mov bx, data
  10.     mov ds, bx
  11.     mov si, 0
  12.     call dtoc
  13.     dec si
  14.     mov dh, 8       ; 定义显示在屏幕第8行
  15.     mov dl, 3       ; 定义显示在屏幕第3列
  16.     mov ch, 2       ; 定义显示为绿色字
  17.     call show
  18.     mov ax, 4c00h
  19.     int 21h

  20. dtoc:
  21.     mov cx, 10
  22. s0: xor dx, dx
  23.     div cx
  24.     add dx, '0'
  25.     mov [si], dl
  26.     inc si
  27.     cmp ax, 0
  28.     jne s0
  29.     ret

  30. show:
  31.     mov ax, 0b800h      ; 把显存地址给es
  32.     mov es, ax
  33.     mov al, 160         ; 显示每行为160字节
  34.     mul dh              ; 行数乘字节=整字节数
  35.     mov di, ax          ; 结果给di
  36.     mov al, 2           ; 每字=两个字节去乘列数
  37.     mul dl              ; 这里面是列数,结果乘完放在ax里
  38.     add di, ax          ; 加上总字节数=偏移地址

  39. s:  cmp si, 0ffffh
  40.     je ok
  41.     mov cl, [si]        ; 把data段内的字符串给它
  42.     dec si
  43.     mov es:[di], cx
  44.     add di, 2
  45.     jmp s
  46. ok: ret
  47. code ends

  48. end start
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2022-12-31 16:42:40 | 显示全部楼层
本帖最后由 jackz007 于 2022-12-31 16:44 编辑
  1. assume cs:code , ds:data

  2. data segment para public 'DATA'
  3.       db 10 dup(0)
  4. data ends
  5.         
  6. stack segment para stack 'STACK'
  7.       db 400h dup(0)
  8. stack ends

  9. code segment para public 'CODE'
  10. dtoc proc near
  11.                  cld
  12.                  xor bx,bx
  13.                  mov cx,10
  14. d01:             xor dx,dx
  15.                  div cx
  16.                  add dl,48
  17.                  mov [si+bx],dl
  18.                  or ax,ax
  19.                  jz d02
  20.                  inc bx
  21.                  jmp short d01
  22. d02:             push bx
  23.                  pop cx
  24.                  shr cx,1
  25.                  mov di,bx
  26.                  add di,si
  27. d03:             mov al,[si]
  28.                  xchg [di],al
  29.                  mov [si],al
  30.                  inc si
  31.                  dec di
  32.                  loop d03
  33.                  ret
  34. dtoc endp

  35. show proc near
  36.                  push es
  37.                  push cx
  38.                  mov ax,0b800h
  39.                  mov es,ax
  40.                  mov al,160
  41.                  mov cl,dh
  42.                  mul cl
  43.                  shl dl,1
  44.                  xor dh,dh
  45.                  add ax,dx
  46.                  mov di,ax
  47. s01:             lodsb
  48.                  or al,al
  49.                  jz s02
  50.                  stosb
  51.                  pop ax
  52.                  push ax
  53.                  stosb
  54.                  jmp short s01
  55. s02:             pop cx
  56.                  pop es
  57.                  ret
  58. show endp

  59. main proc far
  60.                  mov ax,data
  61.                  mov ds,ax
  62.                  mov ax,12666
  63.                  mov si,0
  64.                  call dtoc
  65.                  mov si,0
  66.                  mov dh,8 ;定义显示在屏幕第8行
  67.                  mov dl,3 ;定义显示在屏幕第3列
  68.                  mov cl,2 ;定义显示为绿色字            
  69.                  call show
  70.                  mov ax,4c00h
  71.                  int 21h
  72. main endp
  73. code ends
  74. end main  
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-1 13:59:35 | 显示全部楼层
人造人 发表于 2022-12-31 15:54
错的地方有点多
12666 / 10 等于多少?
等于1266,余数是6,没问题吧?

感谢感谢!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-1 14:48:30 | 显示全部楼层
人造人 发表于 2022-12-31 15:54
错的地方有点多
12666 / 10 等于多少?
等于1266,余数是6,没问题吧?

还有个问题就是第26行xor dx,dx为什么是必需的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-1 15:03:07 | 显示全部楼层
LPY0204 发表于 2023-1-1 14:48
还有个问题就是第26行xor dx,dx为什么是必需的

你学div指令的时候应该学过吧?
http://c.biancheng.net/view/3606.html
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-1 15:04:34 | 显示全部楼层
LPY0204 发表于 2023-1-1 14:48
还有个问题就是第26行xor dx,dx为什么是必需的

8位的除法,被除数在AX中
16位的除法,被除数在DX:AX中
忘了?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-1 15:55:28 | 显示全部楼层
人造人 发表于 2023-1-1 15:04
8位的除法,被除数在AX中
16位的除法,被除数在DX:AX中
忘了?

okk
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-18 22:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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