laocaiye 发表于 2025-3-6 17:11:55

实验10(3)正确版本

经过一天的测试,修改,终于搞定实验10(3)的拓展版。现分享交流。


assume cs:code

data segment
    db 10 dup(0)
data ends

code segment

start:
    mov bx, data
    mov ds, bx
    mov dx, 65432
    mov ax, 12345
    mov di, 10
    mov si, 0

    call dtoc

    mov dh, 8 ;8行
    mov dl, 3 ;3列
    mov cl, 2 ;字符属性

    call show_str
       
    mov ax, 4c00h
    int 21h

dtoc:
    mov si, 9 ; 从数据段最大偏移地址开始保存数据
    mov di, 10 ; 这里使用di用于除数操作,每次除10

    mov cx, dx
    jcxz dx_is0 ;如果dx=0,只需考虑ax
    push dx
    call loopfive
    pop dx
    mov ax, dx
    jmp unknowloop

dx_is0:
    mov cx, ax
    jcxz num_is0 ; 当数字为0时
    jmp unknowloop

num_is0:
    mov dl, 0
    add dl, 30h
    mov ds:,dl
    ret

unknowloop: ;当高16位dx为0,或者把高16位dx给ax后,因此时ax位数未知,将调用此代码
    mov dx,0
        div di
    add dl, 30h
    mov ds:,dl
    mov cx, ax
    jcxz retpoint
    dec si
    jmp short unknowloop

loopfive:    ;当高16位dx !=0 时,低16位ax必须取数字5次
    mov cx, 5t
five:
        mov dx,0;因为只是对低16位ax进行除法运算,所以循环前要把高16位置0
    div di
    add dl, 30h
    mov ds:, dl
    dec si
    loop five
    ret

show_str:
    mov ax, 0b800h
    mov es, ax

        mov ah,0
    mov al, 160
    mul dh
    mov di, ax
    mov al, 2
    mul dl
    add di, ax

    mov al, cl
       
save_str:
        mov cx,10
    sub cx, si
    jcxz retpoint
    mov dl,
    mov es:, dl
    mov es:.1, al
    inc si
    add di,2
    jmp short save_str

retpoint:        ret
code ends

end start

FishC 发表于 2025-3-6 17:12:11

感谢您分享实验程序的拓展版本!根据您的代码分享,我将提供简要点评以帮助其他用户理解这个代码结构和功能。以下是一个对您的代码结构的简单说明:

程序功能

[*]这个程序实现了一个将数值转换为字符串并显示在屏幕上的功能。
[*]使用了16位汇编进行实现,模拟了将整数转换为十进制字符串并在终端上显示。


代码结构

[*]data segment:用于定义要用到的数据空间。
[*]code segment:程序逻辑的主体,包含功能函数。
[*]dtoc:将数值转换为字符数组的函数。
[*]show_str:负责将转换后的字符串显示到屏幕上。
[*]retpoint:程序返回点,控制程序流返回。


注意事项

[*]确保数据段和代码段正确管理,以避免段寄存器和偏移的错误使用。
[*]处理字符串显示的逻辑中注意有无字符属性设置及显示偏移。
[*]在使用DOS功能调用时,需保证正确的中断设置。


有兴趣的朋友可以从代码中学习如何进行基本的十进制转字符处理,并结合其他功能模块进行扩展。有什么技术问题或者需要的更详细的解释,欢迎随时讨论交流!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 实验10(3)正确版本