![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-09-14 23:49 |
共 47,812 主题排行 / 349,917 发帖 / 今日 0 篇 / 48,268 会员排行 |
| DOS开发编程 & 发展交流 (开发室) » 汇编语言编译器使用6 |
| 可打印版本 2,606 / 6 |
| 第1楼 chrise | 发表于 2010-04-12 23:30 |
| 初级用户 发帖 32 积分 88 | |
|
汇编语言编译器使用6 编写一个主程序,从键盘输入两位非压缩BCD数,存入AX,未来将其转化为二进制数,应编写一个远类型的子程序。若将字符显示出来,可用近类型子程序实现,也可用源类型子程序实现。主程序执行时,数据可循环输入,遇到‘00’结束
NAME EX_05_19 STACKS SEGMENT DB 100 DUP(0) STACKS ENDS EXTRN CON:FAR,DISP:FAR CODES SEGMENT ASSUME CS:CODES,SS:STACKS MAIN PROC FAR START:PUSH DS MOV AX,0 PUSH AX REV:MOV AX,1 INT 21H MOV BL,AL INT 21H MOV AH,AL MOV AL,BL CMP AX,3030H JE ENDTRAN CALL NEAR PTR TRAN CALL FAR PTR CON MOV AL,0DH CALL FAR PTR DISP MOV AL,0AH CALL FAR PTR DISP JMP REV ENDTRAN:RET MAIN ENDP TRAN PROC NEAR AND AX,0F0FH MOV BL,AL MOV CL,3 SHL BL,CL MOV CL,1 SHL AL,CL ADD AL,BL ADD AL,AH RET TRAN ENDP CODES ENDS END START NAME EX_05_09_2 PUBLIC CON,DISP CSBG SEGMENT PARA 'CODE' ASSUME CS:CSBG CON PROC FAR PUSH AX MOV CL,4 SHR AL,CL ADD AL,30H ADD AL,30H CMP AL,39H JBE CON2 ADD AL,7 CON2:PUSH AX MOV AL,0DH CALL FAR PTR DISP;不明白 MOV AL,0AH CALL FAR PTR DISP POP AX CALL FAR PTR DISP POP AX AND AL,0FH ADD AL,30H CMP AL,39H JBE CON1 ADD AL,07H CON1:CALL DISP RET CON ENDP DISP PROC FAR MOV DL,AL MOV AH,2 INT 21H RET DISP ENDP CSBG ENDS END 程序可以正常编译,但运行有问题,结果不合适。有以下疑惑: 1)能不能给我说一下代码问题。键盘输入的数字是十六进制码表示,前面请教过,通过子程序TRAN转换后成了什么码?是不是通过MOV DL,02H,int21H 显示时必须是十六进制码。说实话,这个题目我就看不明白,能不能给我详细说一下,他们怎么转换的? 2) 我标出一句,觉得应该吧FAR改为NEAR,是段内 谢了 |
|
| 第2楼 chrise | 发表于 2010-04-14 19:30 |
| 初级用户 发帖 32 积分 88 | |
|
回答一下 070大哥,本是大哥,麻烦回答一下
|
|
| 第3楼 070 | 发表于 2010-04-14 21:15 |
| 高级用户 发帖 218 积分 663 来自 福建 | |
Originally posted by chrise at 2010-4-14 19:30: 我不是大哥,我也是菜鸟,汇编也是一知半解,哈。都要看书才能回答你的。 本是 绝对是 大哥,人家写了很多汇编程序的。 首先,前面你问了下面代码是干什么的,我没有回答清楚 STACKS SEGMENT DB 100 DUP(0) ;这个应该是申请堆栈空间,100字节,初始值全为0. DB 和 DUP是伪代码,你可以从书上查到的。 STACKS ENDS
你是不是把贴出来的代码都输入到一个文件里去了? 这样不行的。 这个程序应该是演示两个源文件如何共同汇编成一个可执行程序的,所以才需要用到 远指针。 我改成两个文件,不过也没有成功,只能等本是大哥了,哈。 这里是BCD码的作用,http://baike.baidu.com/view/45179.htm。 计算机并不知道他处理的数据是BCD码,他只认识二进制。十六进制是因为表示二进制方便才采用的,你在汇编代码中用十进制代替十六进制也是可以的。 |
|
| 第4楼 chrise | 发表于 2010-04-14 23:06 |
| 初级用户 发帖 32 积分 88 | |
|
谢谢 不过那个代码问题还是不怎么明白
|
|
| 第5楼 本是 | 发表于 2010-04-15 20:20 |
| 银牌会员 发帖 790 积分 2,227 | |
|
改REV:MOV AX,1为REV:mov aH,1
改 SHL BL,CL 为 shl Al,cl MOV CL,1 MOV CL,1 SHL AL,CL shl Bl,cl 改 ADD AL,30H 为 一行add al,30h ADD AL,30H 改 CALL FAR PTR DISP;不明白 MOV AL,0AH 为两行,如 CALL FAR PTR DISP;不明白 MOV AL,0AH 就能汇编并链接,然后执行,输入两位BCD数字,得到16进制数字。 |
|
| 第6楼 070 | 发表于 2010-04-15 21:29 |
| 高级用户 发帖 218 积分 663 来自 福建 | |
|
本是,他这个汇编例子的目的好像是演示 两个文件一同编译,而不是在一个文件里
|
|
| 第7楼 本是 | 发表于 2010-04-15 23:00 |
| 银牌会员 发帖 790 积分 2,227 | |
|
当然!他的源程序前有文件名提示的EX_05_19。我改动后,汇编(masm EX_05_19;并masm EX_05_09_2;)、链接(link EX_05_19+EX_05_09_2)并运行验证:如5楼改动后成功。
[ Last edited by 本是 on 2010-4-15 at 23:02 ] |
|
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |