【源码】汇编学习笔记(一)
最近刚学汇编,之前学的语言太多常常遗忘,每次写个程序干脆写点笔记,也方便日后回顾。不足之处望各位指正;汇编程序之判断闰年
stack segment stack ; 定义堆栈段
db 100 dup(?) ;堆栈段长100字节, 这里db就是字节的意思,如果是用dw就是字,100 dup(?) 中的dup是重复的意思,这句话是重复100遍,一遍定义一个字节,每个字节里全填0
stack ends ; 堆栈段结束
data segment;数据段
ipt db 'Input year(X to interrupt):', '$' ;定义ipt , '$'是DOS功能调用INT 21H中9号功能要求的要显示字符串的结束标志
msgno db 13, 10,'Its not RunNian',13, 10, '$';13,10分别是回车键,换行键的ASCII码
msgyes db 13, 10,'Its RunNian',13, 10, '$'
data ends;数据段结束
code segment;代码段
assume cs:code, ds:data, ss:stack;确定cs,ds,ss,指向的逻辑段
start:
mov ax, data;设置数据段的段地址ds
mov ds, ax;不可以直接mov ds, data
lea dx, ipt;取得ipt的偏移地址,也就是在ds段中的偏移地址
mov ah, 09h; ah中的9号功能表示要显示一行字符串
int 21h;调用DOS
call inputnum;调用输入数字函数,保存到bx
mov ax, bx
call isrun;调用判断闰年函数,判断ax是否是闰年
cmp ax, 1;返回1表示是闰年
je yes
lea dx, msgno;显示非闰年
mov ah, 09h
int 21h
jmp start;重复执行
yes:
lea dx, msgyes;显示闰年
mov ah, 09h
int 21h
jmp start;重复执行
inputnum proc;输入数字函数(这里的函数比较简单,没有涉及堆栈)
mov bx, 0;先把bx置0
loop1:
mov ah, 01h;调用输入一个字符
int 21h
cmp al, 20h; 空格返回
jz toexit
cmp al, 0dh;回车返回
jz toexit
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;返回
inputnum endp
;汇编判闰年
isrun proc
mov cx, ax; 备份ax到cx,因为ax要被操作
xor dx,dx;dx置0
mov bx, 4;bx置4,先判断能否被4整除,这里本来用8位除法就行,但2000/4=500>255会溢出,采用16位除法,bx是除数,ax是被除数的低位,dx是被除数的高位
div bx;除法操作后ax是商数,dx是余数
cmp dx, 0
jz div4;能被4整除
retno:
xor ax, ax;否则直接返回不是闰年
ret
div4:
mov ax, cx
xor dx,dx
mov bx, 100
div bx
cmp dx, 0
jz div100;能被100整除
retyes:
mov ax, 1
ret
div100:
mov ax, cx
xor dx,dx
mov bx, 400;400 is bigger than 256
div bx
cmp dx, 0;如果能被400整除
jz retyes
jmp retno
isrun endp
fini:
mov ah, 4ch;退出 ah中的功能号4ch表示要返回DOS
int 21h;调用DOS
code ends
end start
附上一张最后的效果图:
qq179395714 发表于 2016-3-5 09:38
学汇编用什么软件
Visual Studio 2017可以做win32汇编开发;
如果是80x86汇编可以用DOSBox-0.74+Masm5模拟Dos环境进行开发。 不懂破解 发表于 2016-3-5 09:44
之前学习过一段时间,但太难了没坚持下去,楼主加油哦。
o(^▽^)o。。必须要坚持啊。。毕竟还有一门这样的课程{:1_907:} 小白表示完全看不懂····{:301_1008:} 学汇编要好好坚持 加油! 汇编好难 可望不可及,楼主加油 学汇编要好好坚持 加油! 好难呀楼主这要学多久? 楼主加油,坚持就一定会越来越牛的 这东西很难,上课听着就睡着了! 学汇编用什么软件