1.一个字节表示一个十进制数(非压缩BCD码)
15存储的形式为0000 0001 0000 0101
- 加上3030h
- 3135h高低字节输出就是15
0000 1111
- 除--商--1
- ➕30h输出
- 除--取余--5
- ➕30h输出
2.转移指令和位操作指令
- 无条件转移指令。Jmp理解掌握段内寻址和段间寻址方式
- 条件转移指令,无符号数比较转移,带符号数比较转移,cx为0转移指令(jcxz)
- 【注意⚠️】这些都为短转移指令,当代码过长超出-128-127的的转移范围,学会使用无条件指令作为中间桥梁完成相应的功能
16进制:0~65535
65535
内存中存储方式1111 1111 1111 1111
16进制数 ffff
-
1234h
- 0001 0010 0011 0100
- 循环右移(先低位)0100 0001 0010 0011
- 左 0010 0011 0100 0001
- 与 0000 0000 0000 1111
- 0 0 0 1
rol 大于4位的就进行转移
LST文件中查看
-
euq定义的是一个常量
- db、dw开辟的都是在内存中占用空间,但是equ在内存中并不占用空间
- count que(&-t)表中的字所占用的字节个数
注意这是字节的个数(找字/2)
注意 一个字占两个字节 add si,2
&--当前位置
'&'--字符
1.十进制数转换为十六进制数输出
data segment
t dw 1234h,65535,345,234,6765,111,3,2,4565,1,2346,898,10
count equ($-t)/2 ;计算t的长度,共有几个部分
table db '0123456789ABCDEF' ;用于二进制计算后对应过来找16进制数
temp dw ? ;用于储存
info db 0dh,0ah,'HEX = $';HEX的意思是16进制数
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov bp,count ;储存大循环的次数-bp
mov si,0 ;用于将t[0]第一个给bx
out1:
mov dx,offset info ;将提示信息输出
mov ah,9
int 21h
mov bx,t[si] ;将t[0]第一个给bx
mov ch,4 ; 循环次数:16进制,需要循环4次
in1:
mov cl,4 ;大于两位都需要 借助 寄存器 进行转移
rol bx,cl ; 移动,将最左边的4个移到最右边
mov [temp],bx ;将 移动后的bx 放到 temp 中
and bx,0fh ;进行AND操作,除了末后四位,剩下的清零屏蔽,毕竟16 进制
mov dl,table[bx] ;在table表中找到对应的16进制数
mov ah,2
int 21h ;输出一个字符
mov bx,[temp] ; 每次移动后的temp
dec ch ; ch每次都自减,用于循环判断
jnz in1 ; ch 为0 说明,输出够4位了->结束,否则继续进行右移转换
add si,2 ;进入下一个 字 的十六进制转换
dec bp ;循环次数自减
jnz out1 ;再次进入大循环
mov ah,4ch
int 21h
code ends
end start
2.十进制数转换为二进制数输出
data segment
t dw 1234h,65535,345,234,6765,111,3,2,4565,1,2346,898,10
count equ($-t)/2 ;计算t的长度,共有几个部分
table db '01' ;用于二进制显示
temp dw ? ;用于储存
info db 0dh,0ah,'BIN = $'
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov bp,count ;储存大循环的次数-bp
mov si,0 ;用于将t[0]第一个给bx
out1:
mov dx,offset info
mov ah,9
int 21h
mov bx,t[si]
mov ch,16 ; 循环次数:2进制,需要循环16次
in1:
rol bx,1 ; 移动,将最左边的4个移到最右边
mov [temp],bx ;将已经移动了的bx放到temp中
and bx,01h ;进行AND操作,除了末后四位,剩下的清零屏蔽,毕竟16 进制
mov dl,table[bx] ;在table表中找到对应的2进制数
mov ah,2
int 21h ;输出一个字符
mov bx,[temp] ; 每次移动后的temp
dec ch ; ch每次都自减,用于循环判断
jnz in1 ; ch 为0 说明,输出够4位了,结束
add si,2
dec bp
jnz out1
mov ah,4ch
int 21h
code ends
end start
3.课本99页,计算Y=5X-Y,求绝对值,并显示十进制结果
data segment
X db -6 ; x 定义为字
Y dw ? ; y定义为字节
cc db 0ah,0dh,'Y= $ '
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax ;将数据段段地址赋值给ds
mov al,5
imul X ;ax=5X
sub ax,18 ;ax=5X-18
jns let0 ;结果不为负 则转移
neg ax ;结果为负 则求其绝对值-- 求补运算
let0:
mov Y,ax ;保存结果
;将ax中的二进制数变为十进制数,并显示
mov cx,0
mov bx,10
let1:
mov dx,0
inc cx ;统计余数个数
idiv bx ;ax/10 商在ax,余数在dx
push dx ;保存余数
cmp ax,0 ;商为0 则退出循环
jnz let1 ;结果不为0,则继续进入let1中进行循环,与cmp指令连用
mov dx,offset cc
mov ah,9
int 21h ;利用9号功能将cc提示进行显示
let2: ;循环执行cx次,显示十进制结果
pop ax ;将余数弹入ax中
add ax,0030h ;调整为ascii
mov dl,al ;调用2号功能显示一个字符,一个一个进行输出
mov ah,2
int 21h
dec cx ;像是一个则进行自减
cmp cx,0
jnz let2
mov ah,4ch
int 21h
code ends
end start
4.使用菜单显示(普通跳转)
键盘控制输出类型
data segment
t dw 1234h,65535,345,234,6765,111,3,2,4565,1,2346,898,10
count equ($-t)/2 ;计算t的长度,共有几个部分
HEXMap db '0123456789ABCDEF' ;用于对应过来找16进制数
HEXSave dw ? ;用于储存二进制
HEXMessage db 0dh,0ah,'BIN = $'
BINMap db '01' ;用于对应过来找2进制数
BINSave dw ? ;用于储存
BINMessage db 0dh,0ah,'HEX = $';HEX的意思是16进制数
info db 0dh,0ah,'Welcome to here : 1-HEX ,2-BIN => your choice: $'
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov bp,count ;储存大循环的次数-bp
mov si,0 ;用于将t[0]第一个给bx
main:
mov dx,offset info ;提示信息
mov ah,9
int 21h
mov ah,1 ;输入choice
int 21h
sub al,30h ;键盘输入1,电脑存储的是31h,所以需要减去30h
cmp al,1
jz HEX ;1 - 十六进制
cmp al,2
jz BIN ;2 - 二进制
HEX:
mov bp,count
mov si,0
HEXBig:
mov dx,offset HEXMessage
mov ah,9
int 21h
mov bx,t[si]
mov ch,4
HEXSmall:
mov cl,4
rol bx,cl
mov [HEXSave],bx
and bx,0fh
mov dl,HEXMap[bx]
mov ah,2 ;输出一个字符
int 21h
mov bx,[HEXSave]
dec ch
jnz HEXSmall ;结果不为0,则转移
add si,2
dec bp
jnz HEXBig ;结果不为0,继续进入大循环
jmp main
BIN:
mov bp,count
mov si,0
BINBig:
mov dx,offset BINMessage
mov ah,9
int 21h
mov bx,t[si]
mov ch,16
BINSmall:
rol bx,1
mov [BINSave],bx
and bx,01h
mov dl,BINMap[bx]
mov ah,2
int 21h
mov bx,[BINSave]
dec ch
jnz BINSmall
add si,2
dec bp
jnz BINBig ;结果不为0,继续进入大循环
jmp main
code ends
end start