汇编语言 布尔运算 十六位转二位,再进行NOT操作
发布网友
发布时间:2022-04-23 01:07
我来回答
共2个回答
热心网友
时间:2023-09-28 05:10
; 本程序在MASMPlus 1.2集成环境下通过编译,运行正确
.model tiny
Code Segment
Assume CS:Code,DS:code
; -------------------------------------
; 功能:显示指定地址(Str_Addr)的字符串
; 入口:
; Str_Addr=字符串地址(要求在数据段)
; 用法: Output Str_Addr
; 用法举例:Output PromptStr
Output MACRO Str_Addr
lea dx,Str_Addr
mov ah,9
int 21h
EndM
; -------------------------------------
org 100h
Start: jmp Begin
Press_Key db 13,10,13,10,'The complated. Press any key to exit...$'
Prompt_Hex db 'please input a heximal number(for 4 bits):$'
Prompt_BIN db 13,10,'The binary number is: $'
Prompt_NotB db 13,10,'The NOT code: $'
Prompt_NotX db 13,10,'The result is :$'
; -------------------------------------
; 功能:输出一个字符
; 入口:dl=要显示的字符
Output_Chr proc Near
push ax
mov ah,02h
int 21h
pop ax
ret
Output_Chr endp
; -------------------------------------
; 功能:将AL中的低4位二进制数转换成十六进制显示的ASCII码
; 入口:AL
; 出口:AL=转换后的ASCII码
AL_ASCII Proc Near
cmp al,10 ;AL<10?
jb @@To_ASCII ;AL<10,按数字处理
add al,7 ;AL>=10,按大写字母处理
@@To_ASCII: add al,'0' ;转换成相应的数字或大写字母
ret
AL_ASCII EndP
; -------------------------------------
; 功能:将AL中的字节数据转换成十六进制显示的ASCII码
; 入口:AL
; 出口:AX=转换后的ASCII码
Byte_ASCII Proc Near
push cx
mov cx,4
xor ah,ah ;将AH置0
shl ax,cl ;将AX左移4位
shr al,cl ;将AL右移4位
xchg ah,al
call AL_ASCII ;调用子程序,将AL中的值转换成相应的ASCII码
xchg ah,al
call AL_ASCII
xchg ah,al
pop cx
ret
Byte_ASCII EndP
; -------------------------------------
; 功能:将AX中的字数据转换成十六进制显示的ASCII码,并在当前光标位置显示
; 入口:AX
WordD_ASCII Proc Near
push dx
push ax
push ax
xchg ah,al
call Byte_ASCII ;将AL中的字节数转换成十六进制显示的ASCII码
cmp al,'9'
jbe $+7
mov dl,'0'
call Output_Chr ;显示一个字符
mov dl,al
call Output_Chr ;显示一个字符
mov dl,ah
call Output_Chr ;显示一个字符
pop ax
call Byte_ASCII ;将AL中的字节数转换成十六进制显示的ASCII码
mov dl,al
call Output_Chr ;显示一个字符
mov dl,ah
call Output_Chr ;显示一个字符
mov dl,'H'
call Output_Chr ;显示一个字符
pop ax
pop dx
ret
WordD_ASCII EndP
; -------------------------------------
Display_Binary Proc Near
mov cx,16 ;16位二进制数
@@Display_Bin: mov dl,'1' ;预置要显示的二进制字符
rol bx,1 ;循环左移1位
jc $+4 ;若进位标志置位,显示数字'1'
mov dl,'0' ;进位标志复位,显示数字'0'
mov ah,2 ;显示一个字符
int 21h
loop @@Display_Bin
mov dl,'B'
mov ah,2
int 21h
ret
Display_Binary EndP
; -------------------------------------
; 输入一个4位十六进制数,保存在16位寄存器BX中
Begin: Output Prompt_Hex ;提示输入一个4位十六进制数
mov cx,4
cld
Input_Hex: mov ah,1 ;输入一个字符
int 21h
cmp al,27 ;Esc?
jz Exit_Proc ;若是Esc键,结束程序
cmp al,'0' ;<'0'?
jb Input_Hex ;非法十六进制数,重新输入
cmp al,'9' ;>'9'?
ja $+6 ;>'9',看是否是a~f之间的字母
and al,0fh ;转换成二进制数
jmp Store_Bin
or al,20h ;转换成小写字母
cmp al,'a' ;<'a'?
jb Input_Hex ;非法十六进制数,重新输入
cmp al,'f' ;>'f'?
ja Input_Hex ;非法十六进制数,重新输入
and al,0fh
add al,9
Store_Bin: push cx
mov cx,4
shl bx,cl
or bl,al ;保存这个二进制数
pop cx
loop Input_Hex
; -------------------------------------
; 将其转换为二进制数的形式显示
Output Prompt_BIN ;提示显示对应的二进制数
call Display_Binary ;显示16位二进制数
; -------------------------------------
; 对该十六进制数进行NOT操作并以二进制数的形式显示
Output Prompt_NotB ;提示显示取反操作后对应的二进制数
not bx ;取反
call Display_Binary ;显示16位二进制数
; -------------------------------------
; 以十六进制数的形式显示
Output Prompt_NotX ;提示显示取反操作后对应的十六进制数
mov ax,bx
call WordD_ASCII ;将AX中的字数据转换成十六进制显示的ASCII码,并在当前光标位置显示
; -------------------------------------
Exit_Proc: Output Press_Key ;提示操作完成,按任意键结束程序
mov ah,1
int 21h
mov ah,4ch ;结束程序
int 21h
Code Ends
END Start
热心网友
时间:2023-09-28 05:11
;
本程序在MASMPlus
1.2集成环境下通过编译,运行正确
.model
tiny
Code
Segment
Assume
CS:Code,DS:code
;
-------------------------------------
;
功能:显示指定地址(Str_Addr)的字符串
;
入口:
;
Str_Addr=字符串地址(要求在数据段)
;
用法:
Output
Str_Addr
;
用法举例:Output
PromptStr
Output
MACRO
Str_Addr
lea
dx,Str_Addr
mov
ah,9
int
21h
EndM
;
-------------------------------------
org
100h
Start:
jmp
Begin
Press_Key
db
13,10,13,10,'The
complated.
Press
any
key
to
exit...$'
Prompt_Hex
db
'please
input
a
heximal
number(for
4
bits):$'
Prompt_BIN
db
13,10,'The
binary
number
is:
$'
Prompt_NotB
db
13,10,'The
NOT
code:
$'
Prompt_NotX
db
13,10,'The
result
is
:$'
;
-------------------------------------
;
功能:输出一个字符
;
入口:dl=要显示的字符
Output_Chr
proc
Near
push
ax
mov
ah,02h
int
21h
pop
ax
ret
Output_Chr
endp
;
-------------------------------------
;
功能:将AL中的低4位二进制数转换成十六进制显示的ASCII码
;
入口:AL
;
出口:AL=转换后的ASCII码
AL_ASCII
Proc
Near
cmp
al,10
;AL<10?
jb
@@To_ASCII
;AL<10,按数字处理
add
al,7
;AL>=10,按大写字母处理
@@To_ASCII:
add
al,'0'
;转换成相应的数字或大写字母
ret
AL_ASCII
EndP
;
-------------------------------------
;
功能:将AL中的字节数据转换成十六进制显示的ASCII码
;
入口:AL
;
出口:AX=转换后的ASCII码
Byte_ASCII
Proc
Near
push
cx
mov
cx,4
xor
ah,ah
;将AH置0
shl
ax,cl
;将AX左移4位
shr
al,cl
;将AL右移4位
xchg
ah,al
call
AL_ASCII
;调用子程序,将AL中的值转换成相应的ASCII码
xchg
ah,al
call
AL_ASCII
xchg
ah,al
pop
cx
ret
Byte_ASCII
EndP
;
-------------------------------------
;
功能:将AX中的字数据转换成十六进制显示的ASCII码,并在当前光标位置显示
;
入口:AX
WordD_ASCII
Proc
Near
push
dx
push
ax
push
ax
xchg
ah,al
call
Byte_ASCII
;将AL中的字节数转换成十六进制显示的ASCII码
cmp
al,'9'
jbe
$+7
mov
dl,'0'
call
Output_Chr
;显示一个字符
mov
dl,al
call
Output_Chr
;显示一个字符
mov
dl,ah
call
Output_Chr
;显示一个字符
pop
ax
call
Byte_ASCII
;将AL中的字节数转换成十六进制显示的ASCII码
mov
dl,al
call
Output_Chr
;显示一个字符
mov
dl,ah
call
Output_Chr
;显示一个字符
mov
dl,'H'
call
Output_Chr
;显示一个字符
pop
ax
pop
dx
ret
WordD_ASCII
EndP
;
-------------------------------------
Display_Binary
Proc
Near
mov
cx,16
;16位二进制数
@@Display_Bin:
mov
dl,'1'
;预置要显示的二进制字符
rol
bx,1
;循环左移1位
jc
$+4
;若进位标志置位,显示数字'1'
mov
dl,'0'
;进位标志复位,显示数字'0'
mov
ah,2
;显示一个字符
int
21h
loop
@@Display_Bin
mov
dl,'B'
mov
ah,2
int
21h
ret
Display_Binary
EndP
;
-------------------------------------
;
输入一个4位十六进制数,保存在16位寄存器BX中
Begin:
Output
Prompt_Hex
;提示输入一个4位十六进制数
mov
cx,4
cld
Input_Hex:
mov
ah,1
;输入一个字符
int
21h
cmp
al,27
;Esc?
jz
Exit_Proc
;若是Esc键,结束程序
cmp
al,'0'
;<'0'?
jb
Input_Hex
;非法十六进制数,重新输入
cmp
al,'9'
;>'9'?
ja
$+6
;>'9',看是否是a~f之间的字母
and
al,0fh
;转换成二进制数
jmp
Store_Bin
or
al,20h
;转换成小写字母
cmp
al,'a'
;<'a'?
jb
Input_Hex
;非法十六进制数,重新输入
cmp
al,'f'
;>'f'?
ja
Input_Hex
;非法十六进制数,重新输入
and
al,0fh
add
al,9
Store_Bin:
push
cx
mov
cx,4
shl
bx,cl
or
bl,al
;保存这个二进制数
pop
cx
loop
Input_Hex
;
-------------------------------------
;
将其转换为二进制数的形式显示
Output
Prompt_BIN
;提示显示对应的二进制数
call
Display_Binary
;显示16位二进制数
;
-------------------------------------
;
对该十六进制数进行NOT操作并以二进制数的形式显示
Output
Prompt_NotB
;提示显示取反操作后对应的二进制数
not
bx
;取反
call
Display_Binary
;显示16位二进制数
;
-------------------------------------
;
以十六进制数的形式显示
Output
Prompt_NotX
;提示显示取反操作后对应的十六进制数
mov
ax,bx
call
WordD_ASCII
;将AX中的字数据转换成十六进制显示的ASCII码,并在当前光标位置显示
;
-------------------------------------
Exit_Proc:
Output
Press_Key
;提示操作完成,按任意键结束程序
mov
ah,1
int
21h
mov
ah,4ch
;结束程序
int
21h
Code
Ends
END
Start