鱼C论坛

 找回密码
 立即注册
查看: 1357|回复: 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                        
想知道小甲鱼最近在做啥?请访问 -> 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之前和之后,大脑中是个什么状态?
还有,除完之后的字符串是正序的还是反序的?

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

另一个非常非常非常重要的是
把代码格式弄好,你自己看着舒服,别人看着也舒服
何乐而不为呢?
; 将data段内字符串显示在屏幕指定位置

assume cs:code

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
    dec si
    mov dh, 8       ; 定义显示在屏幕第8行
    mov dl, 3       ; 定义显示在屏幕第3列
    mov ch, 2       ; 定义显示为绿色字
    call show
    mov ax, 4c00h
    int 21h

dtoc:
    mov cx, 10
s0: xor dx, dx
    div cx
    add dx, '0'
    mov [si], dl
    inc si
    cmp ax, 0
    jne s0
    ret

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

s:  cmp si, 0ffffh
    je ok
    mov cl, [si]        ; 把data段内的字符串给它
    dec si
    mov es:[di], cx
    add di, 2
    jmp s
ok: ret
code ends

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

使用道具 举报

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

data segment para public 'DATA'
      db 10 dup(0)
data ends
        
stack segment para stack 'STACK'
      db 400h dup(0)
stack ends

code segment para public 'CODE'
dtoc proc near
                 cld
                 xor bx,bx
                 mov cx,10
d01:             xor dx,dx
                 div cx
                 add dl,48
                 mov [si+bx],dl
                 or ax,ax
                 jz d02
                 inc bx
                 jmp short d01
d02:             push bx
                 pop cx
                 shr cx,1
                 mov di,bx
                 add di,si
d03:             mov al,[si]
                 xchg [di],al
                 mov [si],al
                 inc si
                 dec di
                 loop d03
                 ret 
dtoc endp

show proc near
                 push es
                 push cx
                 mov ax,0b800h
                 mov es,ax
                 mov al,160
                 mov cl,dh
                 mul cl
                 shl dl,1
                 xor dh,dh
                 add ax,dx
                 mov di,ax
s01:             lodsb
                 or al,al
                 jz s02
                 stosb
                 pop ax
                 push ax
                 stosb
                 jmp short s01
s02:             pop cx
                 pop es
                 ret
show endp

main proc far
                 mov ax,data
                 mov ds,ax
                 mov ax,12666
                 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
main endp
code ends
end main  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

还有个问题就是第26行xor dx,dx为什么是必需的
想知道小甲鱼最近在做啥?请访问 -> 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

8位的除法,被除数在AX中
16位的除法,被除数在DX:AX中
忘了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-24 22:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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