data segment
cur dw 0;第几位
data ends
...
xor bx,bx
mov bl,num
mov cur,bx
mul10:cmp si,cur;如果外循环正处于第n位,内循环也处于第n位,不需要再乘以10
jz endd
mov bx,0ah
mul bx;ax*10,结果存放在dx|ax
dec cur
jmp mul10
endd:
DECOUT
DECOUT中BX的值可以决定输出的进制
binout proc;将ax的值以二进制显示
xor si,si;利用si寻址
mov bx,2
divv:cwd
div bx;余数在dx
add dl,30h;转位ascii码
mov num[si],dl;
inc si
cmp ax,0;商0即结束
jnz divv;商不为0的时候
mov cx,si
;上面多加了一次si
display: dec si
mov dl,num[si]
mov ah,02h;调用字符显示
int 21h
loop display
ret
binout endp
data segment;定义数据段
x db 'A'; define byte定义x为一个值为A的ASCII码的字节型变量
y dw 30h; define word定义y为一个值为30h(48)的字型变量
z dd 40h; define double word定义z为一个值为40h(64)的双字型变量
a dw ?;定义一个变量
data ends;段结束的标记
stack1 segment para stack;不需要堆栈段可以不要这部分
db 10h dup(0)
stack1 ends
code segment
assume cs:code,ds:data; assume伪指令用于确定段与段寄存器的关系,assume不会翻译成机器指令,但会存在于exe的文件头中,这会方便DOS重新分配内存时改变对应地址指针寄存器的值
start:mov ax,data;汇编后段名变成立即数,立即数不能直接赋值给段寄存器
mov ds,ax;段寄存器将指向data数据段
mov dl,x;显示字符前将字符移动到dl
mov ah,02h;调用字符显示
int 21h
mov ah,4ch;4ch对应返回控制台子程序
int 21h;根据ah确定子程序,自动跳转到子程序入口地址
code ends
end start
#大小写转换
data segment;数据段
errs db 'error!$'
data ends
stack1 segment para stack;堆栈段
stack1 ends
code segment;代码段
assume cs:code,ds:data
start:mov ax,data;程序起点
mov ds,ax
input:mov ah,08h;控制台输入到al
int 21h
cmp al,'0';是否=0
jz zero
cmp al,'A';是否>=A,大于等于则cf=0,对应jnc
jc err;<A且!=0的情况
;下面的情况>=A
cmp al,5bh;是否<=Z,和Z的后一个字符比较,小于则cf=1,对应jc
jc plus
;下面的情况>Z
cmp al,'a'
jc err
cmp al,7bh
jc minus
jnc err
zero: mov dl,'0';移动到dl供显示
mov ah,02h;字符显示
int 21h
mov ah,4ch;返回控制台
int 21h
plus: add al,20h
mov dl,al
jmp show
minus: sub al,20h
mov dl,al
jmp show
show: mov ah,02h;字符显示
int 21h
loop input
err: mov dx,offset errs;将errs首地址传送给dx
mov ah,09h;召唤字符串
int 21h;芝麻开门
loop input
code ends;代码段结束
end start