汇编⼊门之输⼊、输出、奇偶判断、多字节变量定义原创⽂章,转载请注明: 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 指令说明
参考:
1.5 ⽆符号条件转移指令
JE/JZ ZF=1Jump Equal or Jump Zero
JNE/JNZ ZF=0Jump Not Equal or Jump Not Zero
JA/JNBE CF=0 and ZF=0Jump Above or Jump Not Below or Equal
JAE/JNB CF=0Jump Above or Equal or Jump Not Below
JB/JNAE CF=1Jump Below or Jump Not Above or Equal
JBE/JNA CF=1 or AF=1Jump Below or Equal or Jump Not Above
2.程序内容描述
已知两个整数变量 A 和B,试编写完成下述操作的程序:
(1)、若两个数中有⼀个是奇数,则将奇数存⼊A 中,偶数存⼊B 中。
(2)、若两个数均为奇数,则两数分别加1,并存回原变量。
(3)、若两个数均为偶数,则两变量不变。
3.程序流程描述
4.源代码
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,offt X
call OUTPUT
;输出奇数字符串
mov dx,offt 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,offt X;取1的偏移地址给dx
call OUTPUT
;输出偶数字符串
mov dx,offt 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,offt Y
call OUTPUT
;输出奇数字符串
mov dx,offt Odd;输出奇数字符串
call OUTPUT
inc X[si]
inc Y[di]
jmp EXIT
OE:
;
输出Y
mov dx,offt Y;取1的偏移地址给dx
call OUTPUT
;输出偶数字符串
mov dx,offt Eve
call OUTPUT
jmp EXIT
EE:
;输出Y
mov dx,offt Y;取1的偏移地址给dx
call OUTPUT
;
输出偶数字符串
mov dx,offt Eve
call OUTPUT
jmp EXIT
EO:
;输出Y
mov dx,offt Y
call OUTPUT
;输出奇数字符串
mov dx,offt 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,offt X
call OUTPUT
mov dx,offt Entx
call OUTPUT
mov dx,offt Y
call OUTPUT
mov dx,offt 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
View Code