实验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 感谢您分享实验程序的拓展版本!根据您的代码分享,我将提供简要点评以帮助其他用户理解这个代码结构和功能。以下是一个对您的代码结构的简单说明:
程序功能
[*]这个程序实现了一个将数值转换为字符串并显示在屏幕上的功能。
[*]使用了16位汇编进行实现,模拟了将整数转换为十进制字符串并在终端上显示。
代码结构
[*]data segment:用于定义要用到的数据空间。
[*]code segment:程序逻辑的主体,包含功能函数。
[*]dtoc:将数值转换为字符数组的函数。
[*]show_str:负责将转换后的字符串显示到屏幕上。
[*]retpoint:程序返回点,控制程序流返回。
注意事项
[*]确保数据段和代码段正确管理,以避免段寄存器和偏移的错误使用。
[*]处理字符串显示的逻辑中注意有无字符属性设置及显示偏移。
[*]在使用DOS功能调用时,需保证正确的中断设置。
有兴趣的朋友可以从代码中学习如何进行基本的十进制转字符处理,并结合其他功能模块进行扩展。有什么技术问题或者需要的更详细的解释,欢迎随时讨论交流!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页:
[1]