道清
发表于 2025-8-26 20:00:52
ercircle 发表于 2025-8-26 17:19
我上面发的不一定编译时报错,运行时可能异常或跑飞。
有CALL就要有RET,不明白建议可以看下陈桂友老师 ...
非常感谢两位老师的帮助,加RET程序成功了
但是我还是想不通其中两段的计算逻辑,我现在多不知道怎么提问,因为我根本就想不通其中奥秘。
第1个:PROCESS_HIGH:
第2个:PROCESS_LOW:
这两段还是不知道怎么思考
还有我想请教像这个双字节运算,现在是两8位组合,如果我用16位的单片机是不是就不用这么麻烦了,是不是A也是16位,B也是16位,R和H也多是16位,就直接能加减乘除了
ercircle
发表于 2025-8-26 21:12:49
道清 发表于 2025-8-26 20:00
非常感谢两位老师的帮助,加RET程序成功了
但是我还是想不通其中两段的计算逻辑,我现在多不知道怎么提问 ...
第一个问题,上面已经解释过了两个函数的逻辑~,可以单独拿出来放到一个环境里单步仿真看看各步骤运行结果。
还有就是看下上面推荐的课程补充下遗漏的知识点。
第二个问题,等价思考就是把这个问题全换为8位一样的就方便多了,但是在16位除法上解析32位数呢?可能还是得循环来解析。
还有就是楼主这个程序的用途是什么?是学校作业还是自学汇编吗,自学的话建议从C入手比汇编直观多了。
道清
发表于 2025-8-26 21:56:14
ercircle 发表于 2025-8-26 21:12
第一个问题,上面已经解释过了两个函数的逻辑~,可以单独拿出来放到一个环境里单步仿真看看各步骤运行结 ...
那个RET我知道,只是直接复制了没有注意。
自学的汇编,因为我英语不懂,去过宁波的一个学校,也没有C语言老师带我,
后来找到教汇编的地方,手对手的教学。我就学了汇编,当时我也问过教学的老师双字节问题,他也不知道怎么计算。
我知道C语言的程序多是模块化,只要用不同的语句就可以解决,但问题是没有地方可以让我学习,(我以前也看过十天学会C语言那个视频,就是因为很多疑惑不能解释,所以就没有学会)
还有我的学习会提相应的很多问题,有些老师多不一定会用心解释。
因为我只有问懂了才学的会。所以我就可能会不停的问,想到了就问。
拿这个双字节程序打算做一个测量重量的程序,目前还缺一个用砝码标定的程序,这个标定程序目前还没有头绪。如果各位老师有相应的例子程序,麻烦请给点提示,
谢谢各位老师
ercircle
发表于 2025-8-26 22:45:24
道清 发表于 2025-8-26 21:56
ercircle 发表于 2025-8-26 21:12
第一个问题,上面已经解释过了两个函数的逻辑~,可以单独拿出来放到一个 ...
我还是劝你优先学习C,汇编个人理解只适用于个别算法性能提升或者空间要求严格的场景,而且也基本脱离编程范畴了,全变成数学题了。
个人DIY\常规工作基本碰不到。
拿汇编写这些if else while组成的业务逻辑,就像和人交流,念汉字拼音,还是一个字母一个字母念一样难受~~
开发效率极低的
另外你问C代码问题回答的人还能多点,汇编问题受众就少很多了。
书籍推荐:C Primer Plus,中文的
编程练习:力扣,都有题解也有讨论的地方
至于最后提到的砝码标定,没做过,也不知道要做什么,可以梳理下业务需求,列一下不会的部分。
道清
发表于 7 天前
砝码标定就是,比如一个电子秤,最大称重是10公斤,他的最小显示的00.001公斤(相当于1克)。
我们以前是这样操作的,
第一步先清零,等显示稳定后.按照说明进入标定程序,
第二步输入最大称重10.000,按确定键
第三步放上砝码;输入砝码的正确重量值,(比如3公斤重的砝码)就输入03.000. (比如5公斤重的砝码)就输入05.000.按确定键
完成标定程序,这样标定过后你放的1公斤的重量,他就显示1.000. 你放的1,123公斤的重量,他就显示1.123.
这样这个电子秤就准确了
不过这些标定的数字应该多是要记忆在单片机里,因为关机断后下次开机,不可能有要标定一次。
如果不对其做标定,那么显示的可能是 0 至 65.535, 做完标定后显示的就是 0 至 10.000
道清
发表于 7 天前
ercircle 发表于 2025-8-26 22:45
我还是劝你优先学习C,汇编个人理解只适用于个别算法性能提升或者空间要求严格的场景,而且也基本脱离编 ...
感谢您推荐的书,我以找到,买了
不过C语言的书我买了好几本,因为我学不懂,上次我送了好几本给朋友的小孩了(因为他小孩要学习C语言)
感谢您
道清
发表于 6 天前
ercircle 发表于 2025-8-25 23:05
没想到什么好思路诶,给个笨办法参考:
PROCESS_HIGH:
MOV A, R6
JZ PROCESS_LOW; 高8位为0且低8位<10,处理最后一位
; 高8位减1,补充十位25和个位6
DEC R6
MOV A, #6
ADD A, 34H
MOV 34H, A
MOV A, #25
ADD A, 33H
MOV 33H, A
; 处理各数位进位
LCALL HANDLE_CARRY
SJMP PROCESS_HIGH ; 再次检查高8位
请问: 上面这段里的 高8位减1,补充十位25和个位6 其中25是哪里来的,6是哪里来的,为什么要这两个数,不是其他数字,比如256
ercircle
发表于 6 天前
道清 发表于 2025-8-28 05:43
PROCESS_HIGH:
MOV A, R6
JZ PROCESS_LOW; 高8位为0且低8位
高位的1,就是十六进制0x100,对应十进制256。
拆25*10+6比较直观
当然你也可以尝试拆2*100 + 5*10 + 6
或24*10+16
为什么不直接给个位加256?
一个字节只能存储255(0xFF),直接加必定溢出进位,有进位标识了怎么处理这个进位代表的255呢,还不是要拆吗。
而给个位加6,十位加25,完全不会溢出,可以用统一的代码片段HANDLE_CARRY处理进位。
道清
发表于 6 天前
大概懂了,您是真高手,想出来这么高明的方法。
我研究研究,希望能够研究出来。
还有个事情方便的话请帮我留意一下哪里能学C语言的,我现在就是语句格式不懂,符号代表含义不懂,只要能够学会这个就可以了
我今天让朋友看了大学,好像多没有找到。
谢谢
意思总结:您要是知道哪里能学C语言,麻烦请告诉我,我想学
ercircle
发表于 6 天前
道清 发表于 2025-8-28 21:04
大概懂了,您是真高手,想出来这么高明的方法。
我研究研究,希望能够研究出来。
先看书基本语法过一遍,搭配力扣刷题,难度自选,刷完对比和别人的优劣。
想看视频就B站搜下一堆免费课程。