吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4043|回复: 16
收起左侧

[其他原创] 【源码】汇编学习笔记(二)

[复制链接]
spdv123 发表于 2016-3-14 11:32
这次的程序是个简陋的计算器,感觉一开始处理方法就选的不好(用字符串模拟按位处理会简单些),没法支持负数,代码又长,调试了一上午,感觉注释得比较清楚了,自我勉励一下~
[Asm] 纯文本查看 复制代码
stack segment stack ; 定义堆栈段
dw 100 dup(?) ;堆栈段长100字节, 这里db就是字节的意思,如果是用dw就是字,100 dup(?) 中的dup是重复的意思,这句话是重复100遍,一遍定义一个字节,每个字节里全填0
stack ends

data segment
iptplz db 'Input the fuck to calc:', 13, 10, '$'
next db 13, 10, '$'
lastdx dw 8 dup(0)
data ends

code segment
assume ss:stack, ds:data, cs:code

start:
	mov ax, data
	mov ds, ax
	
	;显示提示信息
	lea dx, iptplz
	mov ah, 09h
	int 21h
	
	xor cx, cx
	push cx;用cx储存当前的计算结果,初始02016-3-14
	lea si, lastdx
	mov [si], 01;首先视为+号
	mov [si+2], 0;标志位,如果不为0了,执行输出
lopcalc:
	call inputnum
	cmp dx, 03
	jnz todeal
	mov [si+2], 1
todeal:
	lea si, lastdx
	mov ax, dx
	mov dx, [si]
	mov [si], ax;取出上一个符号进行计算
	pop cx
	cmp dx, 01
	jz doadd
	cmp dx, 02
	jz dosub
	;如果是等号,显示结果并换行重新开始
	
doadd:
	add cx, bx
	push cx
	jmp finidocalc
dosub:
	sub cx, bx
	push cx
	jmp finidocalc
finidocalc:
	cmp [si+2], 0
	jz lopcalc
	mov ax, cx
	call showint
	jmp start
	;处理用户输入

jmp fini

showint proc;显示数字函数
	cmp ax, 0;0直接输出
	jnz notzero
	mov dx, '0'
	mov ah, 02h
	int 21h
	jmp endshow

notzero:
	xor cx, cx;cx表示位数,初始为0
pushtostack:
	xor dx, dx;被除数是dx和ax的组合。。。不清空会溢出
	mov bx, 10
	div bx
	add dx, '0'
	push dx
	inc cx
	cmp ax, 0
	jz popandshow
	jmp pushtostack

popandshow:
	mov ah, 02h
	pop dx
	int 21h
	loop popandshow

endshow:
	mov ah, 09h
	lea dx, next
	int 21h
	ret
showint endp

inputnum proc;输入数字函数(这里的函数比较简单,没有涉及堆栈)
	mov bx, 0;先把bx置0
loop1:
	mov ah, 01h;调用输入一个字符
	int 21h
	cmp al, '+'; 加号返回
	jz exadd
	cmp al, '-'; 减号返回
	jz exsub
	cmp al, '='; 等号返回
	jz exout
	cmp al, 13 ; 回车返回并输出等号
	jz exoutmore
	cmp al, 'X'; X号退出
	jz fini
	
	sub al, 30h;输入进入al,减去30h是减去’0’
	xor ah, ah;ah置0,使ax等于al
	xchg ax, cx; 新输入的储存在cx中
	mov ax, bx;原有的数在bx,移动到ax中
	mov bx, 10;bx置10
	mul bx;bx乘以ax(10乘以ax)结果在ax中
	add ax, cx;ax=原有的数*10+新输入的数字
	mov bx, ax;bx=ax
	jmp loop1;循环执行
toexit:
	ret;返回
exadd:
	mov dx, 01
	ret
exsub:
	mov dx, 02
	ret
exout:
	mov dx, 03
	ret
exoutmore:
	lea dx, next
	mov ah, 09h
	int 21h
	mov ah, 02h
	mov dx, 61
	int 21h
	mov dx, 03
	ret
inputnum endp

fini:
	mov ah, 01h
	int 21h
	mov ah, 4ch
	int 21h
code ends
end start

( •̀ ω •́ )y再附张图片:
(图片上传不上去。。。Error302谁知道怎么破)

免费评分

参与人数 2热心值 +2 收起 理由
Amanda小黑 + 1 热心回复!
Cizel + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

牧尘大日 发表于 2016-3-14 12:00
感谢楼主分享
默默黎明 发表于 2016-3-14 12:15
xiaopan7881 发表于 2016-3-14 17:04
Pepper 发表于 2016-3-14 17:58
谢谢楼主分享
Fmd1988 发表于 2016-3-14 20:36
感谢楼主分享
先谢郭嘉 发表于 2016-3-15 08:21
感谢楼主分享
smile初恋 发表于 2016-3-15 10:42
楼主好样的。。。
cunese 发表于 2016-3-15 22:41
今天买了本汇编语言。从挖掘机向计算机转型。共勉。
tooo 发表于 2016-3-16 10:42
好长时间不看,都忘了。楼主加油。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 15:22

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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