第二十四节
顺序程序设计
data segment
bcd_buf db 96h
asc_buf db 2 dup(?)
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov al,bcd_buf
mov bl,al
mov cl,4
shr al,cl
add al,30h
mov asc_buf,al
and bl,0fh
add bl,30h
mov asc_buf+1,bl
code ends
end start
换码指令
XLAT ;寄存器(BX+AL)内容---->AL ,BX为表的首地址
MOV AH,4CH ;返回到DOS状态,返回主程序
INT 21H
data segment
tab db 1,4,9,16,25,36,49,64,81
db 100,121,144,169,225
a db 12
b db ?
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov bx,offest tab
mov al,a
xlat
mov b,al
mov ah,4ch
int 21h
code ends
end start
五,分支程序设计
data segment
source db x1,x2
max db ?
data ends
code segment
assume: cs:code,ds:data
start:
mov ax,source
mov max,ax
cmp ax,source+1
jnc one
mov al,source+1
one: mov max,al
code ends
end start
条件转移指令:都是段内转移,不影响标志
JO
JNO
JZ
JNZ
有符号数间的次序关系
G(大于) E(等于) L(小于)
无符号间的次序关系称为
A(高于) E(等于) B(低于)
CMP AX,BX
OF =0 SF=0 AX>BX
OF = 1 SF=1 AX<BX
第二十五节
五、分支程序设计
分支语句习题练习
HLT 停机
data segment
xx db x
yy db ?
data ends
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds,ax
mov al,xx
cmp al,0
jge begin
mov yy,0ffh
hlt
begin: je one
mov yy,1
hlt
one: mov yy,0
hlt
code ends
end start
---------------------------------------------------
比较BUFFER中三个数据,按由大到小排序
data segment
buffer db 87,234,123
data ends
codes segment
assume cs:codes,ds:data
mov ax,cx
mov ds,ax
mov si,offset buffer
mov al,[si]
mov bl,[si+1]
mov cl,[si+2]
cmp al,bl
jae next1
xchg al,bl
next1: cmp al,cl
jae next2
xchg al,cl
next2 cmp bl,cl
jae next3
xchg bl,cl
next3: mov [si],al
mov [si+1],bl
mov [si+2],cl
mov ah,4ch
int 21h
code ends
end start
--------------------------------------------------
六、循环程序设计
通常由四部分组成:
1,初始化部分
2,循环体部分
3,调整部分
4,控制部分
习题:
在所定义的字节数组中找出第一个非0数据,并显示输出其所在数组的下标
data segment
array db 0,0,0,16,0,88,72,0,35,42,99
count equ $-array
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov cx,count
mov di,-1
again: inc di
cmp arry[di],0
loopz again
mov dx,di
or dl,30h ;转换为ASCII码
display:
mov ah,02h
int 21h
mov ah,4ch
int 21h
code ends
end start
-------------------------------------------------------------------
双重循环:
;;从内存BUF单元开始存放有256字节的数据块,统计该数据块中,
;;所有位为‘1’的个数
data segment
buf db 15h,36h...,03h,7fh
count dw 0
data ends
code segment
assume:cs:code,ds:data
start: mov ax,data
mov ds,ax
mov si,offset buf
mov cx,c256
xor bx,bx
rept0: mov dh,08
mov al,[si]
rept1: ror al,1
jnc next
inc bx
next1: dec dh
jnz rept1
inc si
loop rept0
mov count,bx
mov ah,4ch
int 21h
code ends
end start
-----------------------------------------------------------------
;字符大小写转换
data segment
str db 'how are yoU !',0
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov si,offset str
again: mov al,[si]
or al,al
jz ok
cmp al,'A'
jb next
cmp al,'Z'
ja next
add al,20h
mov [si],al
next: inc si
jmp again
ok: mov ax,4c00h
int 21h
code ends
end start
1,数值相关伪指令
正常汇编中数据默认为10进制数,
RADIX 16
更改默认数据为16进制数,
RADIX 16
MOV AX,23d
2,十六进制常数
必须以数字开头,字母H结尾
MOV AX,0FAH
3,二进制常数
字母B结尾
TEST BL,0010100B
4,八进制数
字母Q结尾
127Q
5,字符串常数
用引号括起来的一个或多个字符
‘A’ 值是41H
"ab"值是6162H
算数运算符
+
-
*
/
MOD (模)求余
ADD,100*4+2
关系运算符
EQ 相等
NE 不等
LT 小于
GT 大于
LE 小于等于
GE 大于或等于
运算结果是一个数字值
成立 0FFFFH
不成立 0
MOV AX,1234H GT 1023H
逻辑运算符
AND
OR
XOR
NOT
SHL
SHR
结果是一个数值
数值表达式中的操作符
HIGH 结果是数值表达式的高8位 MOV AX,HIGH(1234H+5) AX=1239H
LOW 结果是数值表达式的低8位
LENGTH
SIZE
OFFSET
SEG
TYPE
WEDTH
MASK
运算符和操作符的优先级
由高到低:
(1)圆括号,尖括号(记录中),方括号,原点符(结构中)
LENGTH,SIZE,WIDTH,MASK
(2)PTR,OFFSET,SEG,TYPE,THIS,冒号(段超越)。属性操作符
(3)*,/,MOD,SHL,SHR
(4)HIGH,LOW
(5)+,-
(6)EQ,NE,LT,LE,GT,GE
(7)NOT
(8)AND
(9)OR,XOR
(10)SHORT
--------------------------------------
练习:
radix 16
mov ax,13d
mov ax,89
radix 2
mov ax,1234h gt 1024h
mov bx,1234h+5 lt 1024h