原创文章,转载请注明:汇编入门之输入、输入、奇偶判断、多字节变量定义 By Lucio.Yang
1.入门参考
首先介绍一个非常好的汇编知识的索引网站:经典汇编语言教程
1.1 MOV CX,[BX]
加方框的意思是说以BX中的数据为地址寻址,将寻址得到的数据放在CX中
1.2 16位寄存器组
4个数据寄存器(AX、BX、CX和DX)
2个变址和指针寄存器(SI和DI) 2个指针寄存器(SP和BP)
4个段寄存器(ES、CS、SS和DS)
1个指令指针寄存器(IP)
1个标志寄存器(Flags)
1.3 DB
定义字节变量的定义符为DB/BYTE(DefineByte),每个字节只占一个字节单元。
1.4 INT 21H 指令说明
参考:INT 21H 指令说明及使用方法
1.5 无符号条件转移指令
JE/JZ | ZF=1 | Jump Equal or Jump Zero |
JNE/JNZ | ZF=0 | Jump Not Equal or Jump Not Zero |
JA/JNBE | CF=0 and ZF=0 | Jump Above or Jump Not Below or Equal |
JAE/JNB | CF=0 | Jump Above or Equal or Jump Not Below |
JB/JNAE | CF=1 | Jump Below or Jump Not Above or Equal |
JBE/JNA | CF=1 or AF=1 | Jump Below or Equal or Jump Not Above |
2.程序内容描述
已知两个整数变量 A 和B,试编写完成下述操作的程序:
(1)、若两个数中有一个是奇数,则将奇数存入A 中,偶数存入B 中。
(2)、若两个数均为奇数,则两数分别加1,并存回原变量。
(3)、若两个数均为偶数,则两变量不变。
3.程序流程描述
4.源代码
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
DATAS SEGMENT Tip db 'Program run successfully',0ah,0dh,'$' Odd db ' is Odd',0ah,0dh,'$' Eve db ' is Even',0ah,0dh,'$' EntX db ' is x ',0ah,0dh,'$' Enty db ' is y ',0ah,0dh,'$' X db 6 dup(?);定义一个5个byte型的空间,内容用()内的数值填充,是?,不用初始化 Y db 6 dup(?) DATAS ENDS STACKS SEGMENT ;此处输入堆栈段代码 STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS START: MOV AX,DATAS MOV DS,AX xor si,si;异或,将变址和指针寄存器清零 xor di,di;第二个指针寄存器 mov cx,5;将5移到cx中,cx控制循环次数 INPUTX: mov ah,01h;键盘输入一个字符 int 21h;键盘输入并且回显,,将ASCII送入AL中 cmp al,'0' jb INPUTY;jump if below cmp al,'9' ja INPUTY;jump if above mov X[si],al;将输入字符移到n[0] inc si;加1指令 jmp INPUTX INPUTY: mov ah,01h;键盘输入一个字符 int 21h;键盘输入并且回显,将ASCII送入AL中 cmp al,'0' jb JUDGEX;jump if below cmp al,'9' ja JUDGEX;jump if above mov Y[di],al;将输入字符移到n[0] inc di;加1指令 jmp INPUTY JUDGEX: mov X[si],'$' dec si;减1指令 xor ah,ah;ah清空 mov al,X[si];si指向低位 mov bl,2 div bl;除法指令(ax/2),被除数默认存放在AX cmp ah,0;无符号比较,ZF=1表示两个数相等 jnz XO;ZF=0,即余数不等于0等于1,为奇数 jz XE XO: ;输出X mov dx,offset X call OUTPUT ;输出奇数字符串 mov dx,offset Odd;输出奇数字符串 call OUTPUT ;判断Y奇偶 mov Y[di],'$' dec di;减1指令 xor ah,ah;ah清空 mov al,Y[di];si指向低位 mov bl,2 div bl;除法指令(ax/2),被除数默认存放在AX cmp ah,0;无符号比较,ZF=1表示两个数相等 jnz OO;ZF=1,即余数不等于0等于1,为奇数 jz OE XE: ;输出X mov dx,offset X;取1的偏移地址给dx call OUTPUT ;输出偶数字符串 mov dx,offset Eve mov ah,09h int 21h ;判断Y奇偶 mov Y[di],'$' dec di;减1指令 xor ah,ah;ah清空 mov al,Y[di];di指向低位 mov bl,2 div bl;除法指令(ax/2),被除数默认存放在AX cmp ah,0;无符号比较,ZF=1表示两个数相等 jnz EO;ZF=1,即余数不等于0等于1,为奇数 jz EE OO: ;输出Y mov dx,offset Y call OUTPUT ;输出奇数字符串 mov dx,offset Odd;输出奇数字符串 call OUTPUT inc X[si] inc Y[di] jmp EXIT OE: ;输出Y mov dx,offset Y;取1的偏移地址给dx call OUTPUT ;输出偶数字符串 mov dx,offset Eve call OUTPUT jmp EXIT EE: ;输出Y mov dx,offset Y;取1的偏移地址给dx call OUTPUT ;输出偶数字符串 mov dx,offset Eve call OUTPUT jmp EXIT EO: ;输出Y mov dx,offset Y call OUTPUT ;输出奇数字符串 mov dx,offset Odd;输出奇数字符串 call OUTPUT mov al,X[0] mov ah,Y[0] xchg ah,X[0] xchg al,Y[0] mov al,X[1] mov ah,Y[1] xchg ah,X[1] xchg al,Y[1] mov al,X[2] mov ah,Y[2] xchg ah,X[2] xchg al,Y[2] mov al,X[3] mov ah,Y[3] xchg ah,X[3] xchg al,Y[3] mov al,X[4] mov ah,Y[4] xchg ah,X[4] xchg al,Y[4] mov al,X[5] mov ah,Y[5] xchg ah,X[5] xchg al,Y[5] jmp EXIT EXIT: xor si,si xor di,di ;输出最后结果 mov dx,offset X call OUTPUT mov dx,offset Entx call OUTPUT mov dx,offset Y call OUTPUT mov dx,offset Enty call OUTPUT dec cx jmp INPUTX;loop INPUTX mov ah,00h;暂停 int 16h MOV AH,4CH;结束,返回DOS INT 21H OUTPUT proc mov ah,09h int 21h ret OUTPUT endp CODES ENDS END START