spdv123 发表于 2016-3-5 08:26

【源码】汇编学习笔记(一)

最近刚学汇编,之前学的语言太多常常遗忘,每次写个程序干脆写点笔记,也方便日后回顾。不足之处望各位指正

;汇编程序之判断闰年
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


附上一张最后的效果图:

haokaidehao 发表于 2017-7-21 15:30

qq179395714 发表于 2016-3-5 09:38
学汇编用什么软件

Visual Studio 2017可以做win32汇编开发;
如果是80x86汇编可以用DOSBox-0.74+Masm5模拟Dos环境进行开发。

spdv123 发表于 2016-3-5 09:54

不懂破解 发表于 2016-3-5 09:44
之前学习过一段时间,但太难了没坚持下去,楼主加油哦。

o(^▽^)o。。必须要坚持啊。。毕竟还有一门这样的课程{:1_907:}

星期五 发表于 2016-3-5 08:38

小白表示完全看不懂····{:301_1008:}

wzxkk123 发表于 2016-3-5 08:56

学汇编要好好坚持 加油!

李道001 发表于 2016-3-5 09:01

汇编好难

cowboys2010 发表于 2016-3-5 09:06

可望不可及,楼主加油

telnetclients 发表于 2016-3-5 09:12

学汇编要好好坚持 加油!

san19788 发表于 2016-3-5 09:20

好难呀楼主这要学多久?

vae3489 发表于 2016-3-5 09:26

楼主加油,坚持就一定会越来越牛的

zt185 发表于 2016-3-5 09:27

这东西很难,上课听着就睡着了!

qq179395714 发表于 2016-3-5 09:38

学汇编用什么软件
页: [1] 2 3
查看完整版本: 【源码】汇编学习笔记(一)