开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 6081|回复: 17
收起左侧

汇编语言做的计算器,带本人的详细解答代码!

[复制链接]
结帖率:25% (1/4)
发表于 2010-10-20 14:17:48 | 显示全部楼层 |阅读模式   山西省忻州市
本帖最后由 奥特曼 于 2010-10-20 14:20 编辑

刚学汇编,哪里写的不好提出来,千万别喷我.呵呵高手可以直接闪过,看不懂的可以加我QQ:79441665,一起学习汇编语言!
下面我把代码贴出来:
line macro n
rept n    ;重复次数
mov dl, 13  ;回车
mov ah, 2
int 21h
mov dl, 10  ;换行
mov ah, 2
int 21h
endm
endm
;==========================换行符!
data segment
num1 dw 0  ;定义数字1为字!
msg1 db 'this is CalCu!',13,10,'please input num1 or num2!',13,10,36 ;定义输出一行数字! 36代表字符串'$'!
data ends
;=========================定义数据段!
code segment
assume cs:code,ds:data
start:   
mov ax, data
mov ds, ax
lea dx, msg1
mov ah, 9
int 21h
call inputNum  ;第一次调用数字转换CALL
line 1         ;输出一次回车换行!
mov [num1], bx ;把BX的内容保存到[num1]里面!
call inputNum  ;第二次调用数字转换CALL
add bx, [num1] ;BX=第二次输入+[num1]里面内容!
call hexNum    ;调用转换程序!
mov dl, 'h'
mov ah, 2
int 21h
mov ah, 7
int 21h
mov ah, 76
int 21h
;================数据输入10转16进制子程序==============
inputNum proc near
xor bx, bx   ;清除BX=0
newchar:
mov ah, 1  ;一号功能输入带回显
int 21h
sub al, 48  ;AL=AL-48
cmp al, 0   ;AL和0比较
jl exit    ;小于0转到exit
cmp al, 9   ;AL和9比较
jg exit    ;大于9转到exit
cbw        ;字节转换字
xchg ax, bx  ;把BX=AX,AX=0
mov cx, 0ah  ;CX=0AH--
mul cx       ;AX=AX*CX-输入的第2个数为个位,第一个输入的成十位所以乘10   
xchg ax, bx  ;把BX=AX,AX=BX-
add bx, ax   ;BX=BX+AX--这4行代表多位相加
jmp newchar ;跳转到newchar
exit:
Ret        ;出栈!,入口参数:AL,出口参数:BX
inputNum endp
;带入一个数字:12
;先输入1,1的ascii是49,减去48=1H,比较是否小于0,不小于的时候看是否大于9.
不大于的话进行字节转换字,AX和BX交换,AX=0H,BX=1H,然后CX=0AH(10进制的10)
AX=AX*CX AX=0 然后进行第2次交换BX=0,AX=1H。然后相加BX=0+1H,BX=0001H,现在是把输入的1进行调整,现在把2进行调整!
再输入2,2的ascii是20,减去48=2H,比较是否小于0,不小于的时候看是否大于9.
不大于的话进行字节转换字,AX和BX交换,AX=1H,BX=2H,然后CX=0AH(10进制的10)
AX=AX*CX AX=0AH 然后进行第2次交换BX=0AH,AX=2H。然后相加BX=0AH+2H,BX=000CH
现在就把12转换成C了,也就是把10进制的12转换成16进制的C。
;================数据转字符显示程序================
hexNum proc near
mov cl, 4    ;CL=4
rot:
ROL bx, CL   ;把BX循环左移4次
mov al, bl   ;AL=BL的低4位
and al, 0fh  ;把AL高位清零
add al, 30h  ;AL=AL+30
cmp al, 3ah  ;比较AL和3AH 判断AL是否大于键盘ascii码表58
jl viewnum    ;小于的话 跳到 viewnum
add al, 7h   ;不小于的话 AL=AL+7H
viewnum:
mov dl, al   ;显示输出
mov ah, 2
int 21h
dec ch      
jnz rot     ;不等于0的话继续
Ret
hexNum endp
;接上面,把上面的16进制C转换成ascii码并且输入出去!
置移位次数,CL=4,把BX循环左移4次,刚才BX=000CH,4次后BX=00C0H,然后把BX的低4位给AL
AL=C0H,然后相与AL=00H。相加AL=30H(10进48,也就是ascii码:‘0’)!比较是否小于3AH(10进58,也就是ascii码:‘:’57ascii码是:‘9’)显示输出:‘0’判断ZF是否为0不为0继续循环做!
;第2次:把BX循环左移4次,刚才BX=00C0H,4次后BX=0C00H,然后把BX的低4位给AL
AL=00H,然后相与AL=00H。相加AL=30H(10进48,也就是ascii码:‘0’)!比较是否小于3AH(10进58,也就是ascii码:‘:’57ascii码是:‘9’)显示输出:‘0’
;第3次:把BX循环左移4次,刚才BX=0C00H,4次后BX=C000H,然后把BX的低4位给AL
AL=00H,然后相与AL=00H。相加AL=30H(10进48,也就是ascii码:‘0’)!比较是否小于3AH(10进58,也就是ascii码:‘:’57ascii码是:‘9’)显示输出:‘0’
;第4次:把BX循环左移4次,刚才BX=C000H,4次后BX=000CH,然后把BX的低4位给AL
AL=0CH,然后相与AL=0CH。相加AL=3CH(10进60,也就是ascii码:‘<’)!比较是否小于3AH(10进58,也就是ascii码:‘:’57ascii码是:‘9’)不小于,所以加7H AL=43H(10进67,也就是ascii码:‘C’)显示输出:‘C’,最后显示为:000C!
;===============================================
Code ends
end start


把生成的.exe运行图 片也贴出来,呵呵!
计算器.jpg 因为最后显示是16进制的数字,12+24=0024H(16进制的),下面计算器是把0024H转换成36的!希望不要搞混!
呵呵,看到精易出了个汇编版块才把自己以前写的代码都贴出来了!希望这版块越办越好吧!

评分

参与人数 1精币 +2 收起 理由
a6842402 + 2 奉上小小红包希望笑纳

查看全部评分

头像被屏蔽
结帖率:55% (6/11)
发表于 2010-10-20 14:52:47 | 显示全部楼层   四川省自贡市
本帖最后由 【微凉清风】 于 2010-10-20 15:54 编辑

我还没弄过汇编呢
回复 支持 反对

使用道具 举报

结帖率:85% (23/27)

签到天数: 2 天

发表于 2010-10-21 09:41:41 | 显示全部楼层   广东省清远市
不错啊.  来顶顶,,
回复 支持 反对

使用道具 举报

发表于 2010-10-23 07:12:12 | 显示全部楼层   河北省衡水市
顶你一下,谢谢楼主分享
回复 支持 反对

使用道具 举报

结帖率:0% (0/2)
发表于 2010-10-30 10:49:02 | 显示全部楼层   上海市上海市
问你一下。。怎么看得懂代码。。我看书都看不懂
回复 支持 反对

使用道具 举报

结帖率:25% (1/4)
 楼主| 发表于 2010-11-4 12:11:09 | 显示全部楼层   山西省忻州市
回复 5# 562867448


    把中山大学的教程看一边就能看懂了.
回复 支持 反对

使用道具 举报

结帖率:0% (0/2)
发表于 2010-11-4 14:57:48 | 显示全部楼层   上海市上海市
回复 6# 奥特曼


    好。。谢谢了
回复 支持 反对

使用道具 举报

发表于 2010-11-5 22:57:37 | 显示全部楼层   四川省成都市
真有耐心!
回复 支持 反对

使用道具 举报

发表于 2010-11-14 13:35:21 | 显示全部楼层   浙江省金华市
先留个印吧。现在看天书。。
回复 支持 反对

使用道具 举报

发表于 2010-11-17 16:02:16 | 显示全部楼层   广西壮族自治区梧州市
支持吧
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表