道清 发表于 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站搜下一堆免费课程。







页: 1 2 [3] 4
查看完整版本: 双字节除法运算汇编程序请高手指导