第一次练习,先再熟悉一遍8086汇编时的代码通用框架:
data segment ;定义数据段,名称随意
;放数据
data ends ;结束句必须要有
code segment ;定义代码段,名称随意 code ends在程序最后
assume cs:code,ds:data ;声明代码段,数据段
Start: ;定义开头标号,名称随意
MOV AX,DATA ;接下来的这两句必须要有
MOV DS,AX ;把data(数据) 转到 DS 数据段寄存器,让数据段指向正确的位置。
;接下来这里可以填写你的程序
code ends
end Start
1> 要完成键盘输入和显示的功能,需要借助 int 21h DOS的中断调用:MOV AH, 01H、MOV AH, 02H
常用DOS(INT 21H)功能调用表
2> 先写一段输入0~9并显示二进制结果的程序:
code segment
assume cs:code
start: mov cx,4
xor bx,bx ;bx清0
input:
mov ah,01h ;dos中断输入功能,输入到al,al中实际存的是ASCII码
;的16进制表示形式,最底层实际存的是二进制形式
int 21h
cmp al,'0' ;若输入0~9以外的字符则跳转到error
jb error ;无符号小于则跳转
cmp al,'9'
sub al,30h ;减30h,取出其对应的十进制值,al中现在存的是0~9
jmp ok
error:
jmp input ;死循环重新输入
ok:
rol bx,1 ;循环移位, 输入0001
rol bx,1 ;循环移位, 输入0012
rol bx,1 ;循环移位, 输入0123
rol bx,1 ;循环移位, 输入1234
or bl,al ;每移位一次后,或上输入的数,存入al
loop input
mov cx,16
disp: ;此段用于显示逗号来空格
cmp cx,16 ;共16位二进制数比较16次
jz next ;跳过第一个逗号
test cx,03h ;01h每隔两个字符显示一个逗号,以此类推
jnz next
mov dl,','
mov ah,02h ;显示逗号
int 21h
next: rol bx,1 ;循环移位, bx变为2341
mov dl,bl
and dl,01h ; 相与后取最低位
or dl,30h ; dl实际底层已自动将0~9存成二进制,用或运算加上30h
;正好变为二进制0和1对应的ASCII码
mov ah,02h ;显示结果
int 21h
loop disp
mov ah,4ch
int 21h
code ends
end start
改进成0~F的:
将显示字符和回车换行的功能,写成宏定义后,可直接调用。
dispchar macro x,y
mov cx,y
dispx:
mov dl,x
mov ah,02h
int 21h
loop dispx
endm
huiche macro
mov ah,02h
mov dl,0dh
int 21h
mov ah,02h
mov dl,0ah
int 21h
endm
code segment
assume cs:code
start: mov cx,4
xor bx,bx
input:
mov ah,01h
int 21h
cmp al,'0'
jb error
cmp al,'9'
ja daxie
sub al,30h
jmp ok
daxie:
cmp al,'A'
Jb error
cmp al,'f'
ja error
sub al,57h
jmp ok
error:
jmp input
ok:
rol bx,1
rol bx,1
rol bx,1
rol bx,1
or bl,al
loop input
huiche
mov cx,16
disp: cmp cx,16
jz next
test cx,03h
jnz next
mov dl,','
mov ah,02h
int 21h
next: rol bx,1
mov dl,bl
and dl,01h
or dl,30h
mov ah,02h
int 21h
loop disp
mov ah,4ch
int 21h
code ends
end start
例:键盘输入4位压缩BCD码,并存入BX中。
DATA SEGMENT
MSG DB "PLEASE INPUT 4 NUMBERS:",0DH,0AH,"$"
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV AH,09H
LEA DX,MSG
INT 21H
MOV CX,4
XOR BX,BX
INPUT:
MOV AH,01H
INT 21H
CMP AL,'0'
JAE NEXT
JMP INPUT
NEXT:
CMP AL,'9'
JBE OK
JMP INPUT
OK:
SUB AL,30H
OK2:
SHL BX,1
SHL BX,1
SHL BX,1
SHL BX,1
OR BL,AL
LOOP INPUT
MOV AH,4CH
INT 21H
CODE ENDS
END START
用P命令追踪查看运行过程:
逐次输入2234H后,最终存入BX寄存器中。