LPY0204 发表于 2022-12-31 14:20:21

实验10.3大佬来看看为啥没有显示

本帖最后由 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 ,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, ;把data段内的字符串给它
                  jcxz ok ;看cx是否为0,为0即跳转至ok处

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

            ok:ret

code ends
end start                        

人造人 发表于 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 , 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,       ; 把data段内的字符串给它
    dec si
    mov es:, cx
    add di, 2
    jmp s
ok: ret
code ends

end start

jackz007 发表于 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 ,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,
               xchg ,al
               mov ,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

LPY0204 发表于 2023-1-1 13:59:35

人造人 发表于 2022-12-31 15:54
错的地方有点多
12666 / 10 等于多少?
等于1266,余数是6,没问题吧?


感谢感谢!!!

LPY0204 发表于 2023-1-1 14:48:30

人造人 发表于 2022-12-31 15:54
错的地方有点多
12666 / 10 等于多少?
等于1266,余数是6,没问题吧?


还有个问题就是第26行xor dx,dx为什么是必需的

人造人 发表于 2023-1-1 15:03:07

LPY0204 发表于 2023-1-1 14:48
还有个问题就是第26行xor dx,dx为什么是必需的

你学div指令的时候应该学过吧?
http://c.biancheng.net/view/3606.html

人造人 发表于 2023-1-1 15:04:34

LPY0204 发表于 2023-1-1 14:48
还有个问题就是第26行xor dx,dx为什么是必需的

8位的除法,被除数在AX中
16位的除法,被除数在DX:AX中
忘了?

LPY0204 发表于 2023-1-1 15:55:28

人造人 发表于 2023-1-1 15:04
8位的除法,被除数在AX中
16位的除法,被除数在DX:AX中
忘了?

okk
页: [1]
查看完整版本: 实验10.3大佬来看看为啥没有显示