汇编语言的高手进~!

kuaidi.ping-jia.net  作者:佚名   更新日期:2024-07-17
★汇编语言高手进

; 本程序在MASMPlus 1.2集成环境下通过编译,经过调试,运行正确。
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
; -------------------------------------
STRING db 'The data is FEB&03'
Lenth_Str equ $-STRING
Press_Key db 7,13,10,13,10,'The complated. Press any key to exit...$'
; -------------------------------------
Start: push cs
pop ds
lea si,STRING ;字符串地址
mov cx,Lenth_Str ;字符个数
@@Replace: cmp BYTE ptr [si],'&' ;'&'?
jnz $+5 ;不是,跳过
mov BYTE ptr [si],20h ;用空格替换
inc si
loop @@Replace
; -------------------------------------
Exit_Proc: Output Press_Key ;提示操作完成,按任意键结束程序
mov ah,1
int 21h
mov ah,4ch ;结束程序
int 21h
Code ENDS
END Start ;编译到此结束

data segment
list db 02h,90h,99h,34h,74h,82h,81h,04h,97h,28h
max db ?
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov cx,10
lea si,list
mov bl,[si]
b:cmp bl,[si+1]
jna n
inc si
loop b
z:lea di,max
mov [di],bl
int 3h
n:xchg bl,[si+1]
inc si
loop b
jmp z
code ends
end start

; 本程序通过编译,运行正确
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
; -----------------------------------------
Prompt_Str db 'Please input a string: $'
Prompt_Str1 db 13,10,'The encoded string: $'
Press_Key db 13,10,13,10,'Press any key to exit...$'
Start: push cs
pop ds
push cs
pop es
Output Prompt_Str ;提示输入字符串
lea dx,Buffer ;字符串缓冲区地址
mov ah,0ah ;dos功能调用0ah号功能:输入字符串
int 21h
lea si,Buffer[1] ;实际输入的字符个数地址
lodsb ;读入实际输入的字符个数
test al,0ffh
jz Exit_Proc ;若直接回车,未输入任何字符,则结束程序,返回操作系统
xor ah,ah ;累加器高位字节清零
mov cx,ax
@@Encoding: lodsb ;读入一个字符
mov ah,al
and ah,0dfh ;假定这个字符为字母,将小写变为大写
cmp ah,'A'
jb @@Next_Chr ;不是字母,不加密
cmp ah,'Z'
ja @@Next_Chr ;不是字母,不加密
add al,4 ;加密
mov ah,al
and ah,0dfh
cmp ah,'Z' ;加密后的字符超出字母范围?
jbe $+4 ;否,转去将加密后的字符写回原位置
sub al,26 ;调整
mov [si-1],al ;加密后的字符写回原位置
@@Next_Chr: loop @@Encoding
mov byte ptr [si],'$' ;将这个字符串以$符结尾,准备用dos功能调用9号功能显示这个字符串
Output Prompt_Str1 ;提示显示加密后的字符串
Output Buffer[2] ;显示加密后的字符串
Output Press_Key
mov ah,1
int 21h
Exit_Proc: mov ah,4ch ;结束程序
int 21h
Buffer db 255,? ;字符串缓冲区
Code ENDS
END Start ;编译到此结束

;编译通过咯,呵呵~~
DATA SEGMENT
BUF DB 100
DB ?
DB 100 DUP(?) ;定义缓冲区
DATA ENDS

CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
INPUT: MOV AX,DATA
MOV DS,AX

MOV DX,OFFSET BUF
MOV AH,0AH
INT 21H ;键盘输入到缓冲区 DS:DX

MOV SI,OFFSET BUF+1 ;取输入的首字符
MOV CX,[SI]
XOR CH,CH ;读Buf+1-->CL控制字符串结束

NEXT: INC SI
; MOV AL,[SI]

JUDGE: CMP [SI],41H
JB SKIP
CMP [SI],57H
JB A2V
CMP [SI],5BH
JB WXYZ
CMP [SI],61H
JB SKIP
CMP [SI],77H
JB A2V
CMP [SI],7BH
JB WXYZ

JZ OUT
SKIP: LOOP NEXT ;处理下一个
JMP OUT
A2V: ADD [SI],4
LOOP NEXT
JMP OUT
WXYZ: ADD [SI],4
SUB [SI],26
LOOP NEXT
JMP OUT

OUT: INC SI
MOV [SI],'$' ;关门$

MOV DX,OFFSET BUF+2
MOV AH,9 ;显示
INT 21H

FIN: MOV AH,4CH
INT 21H
CODE ENDS
END START

DATAS SEGMENT
;此处输入数据段代码
buffer DB 0DH,0AH ;回车和换行符
db 100 dup(?) ;可接收的字符数最大为99,最后一个用来村'$'。
DATAS ENDS

STACKS SEGMENT
;此处输入堆栈段代码
db 200 DUP(?)
STACKS ENDS

CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
lea bx,buffer+2 ;把buffer的偏移地址送bx
again:
MOV AH,01H
INT 21H
CMP AL,0DH ;0D为回车符CR的ASCII码,按回车键结束输入
JZ print
CMP AL,5AH ;5A为Z的ASCII码
JA lower ;如果大于5Ah(即Z)则为小写字母,跳转到lower处进行处理
CMP AL,56H ;56为V的ASCII码 如果大于V则肯定是W,X,Y,Z之一
JA WXYZ ;跳转到WXYZ处进行处理
ADD AL,4 ;AL里面的字母都加上4 A变成E V变成Z
JMP SHORT common
WXYZ:
SUB AL,16H ;正好W和A之间的偏移为16H(十进制22) W要变成A就减去16h X,Y,Z也一样
JMP SHORT common
lower:
ADD AL,4
CMP AL,7AH ;如果加上4后小于7AH(z的ASCII码),则说明它原本是小于w的
JB common
SUB AL,1AH
common:
MOV [BX],AL
INC BX
JMP SHORT again
print:
mov byte ptr[bx],'$'
lea dx,buffer
MOV AH,09H
INT 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START

  • 汇编语言高手进,求程序每一步的意思!,尤其是一开始我知道MOV AX,DATA是...
    答:个人理解:这个AX在这里起到的是一个间接变量的作用。传递DATA的值。DS值改变后,AX里的值依然是DATA的值,当你下次需要用到DATA的值的时候可以直接用AX赋。很多程序都是这样的。
  • 汇编语言的高手请进,问几个简单题目
    答:1 XOR AL,AL INC AL NEG AL INC AL MOV BL,7FH ADC AL,BL 答:上述程序运行后,AL=80H,CF=0 2 下面程序段是判断寄存器AH和AL中第3位是否相同,如相同,AH置0,否则AH置非0。试把空白处填上适当的指令(一个空白只填一条指令)。答: xor ah,al AND AH,08H jz ZERO...
  • 汇编语言高手请进
    答:ORG 00H ;定义程序存储器地址00H START: NOP ;空指令(MCU上电时不稳定,一般会在复位地址 ;加NOP指令,防止程序跑非)MOV R3,#3 ;LOP2: MOV R4,#8 MOV R2,#0 LOP1: MOV P1,#0FFH ;设置P1口为全高(P1口应该是与LED的阳极相连 ;的)MOV DPTR,#TABA ;<查表(R2为相对偏...
  • 关于汇编语言的带符号数的有关问题,高手请进,急!
    答:1、9098H是一个带符号数的补码,转换成二进制数为10010000 10011000B,它的最高位为1,即符号位为1,所以扩展后为11111111 11111111 10010000 10011000B,对应的十六进制数为FFFF9098H,同时,为了将以A到F开头的十六进制数和变量区分开,因为变量是以字母开头的,所以要将以A到F开头的十六进制数前加一个...
  • 急急急!!!懂汇编语言的高手请进
    答:CODE SEGMENT ASSUME CS;CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV AH,01H INT 21H CALL ASC_DEAL MOV X,DL ;将输入的字符转换成为数值存入X MOV AH,01H INT 21H CALL ASC_DEAL MOV Y,DL ;将输入的字符转换成为数值存入Y MOV AH,01H INT 21H CMP DL,41H JG LA CMP DL...
  • 汇编高手进 用汇编语言对4位10进制数加密。密码是0123456789对应为908...
    答:RESULT DB 4 DUP(?);四位十进制数对应的密码 DATA ENDS CODE SEGMENT ASSUME DS:DATA,CS:CODE MAIN PROC FAR MOV AX,DATA MOV DS,AX MOV ES,AX LEA BX,TABLE LEA DI,RESULT MOV AX,1234;已知的四位十进制数,以下分别求四位十进制数位,并将密码存入RESULT中 MOV SI,1000 CALL NUMBER ...
  • 汇编语言高手进
    答:STACK ENDS DATA SEGMENT BUF DW -5,100,32767,-32768,-1,15 DW -4,-9,200,0,300 ;一段名为BUF的数组,作为数据源 N EQU ($ - BUF) / 2 ;数组的元素个数 BUF1 DW N DUP(?) ;一段名为BUF1的空数组,作为目标 BUF2 DW N DUP(?) ;一段名为BUF2的空数组...
  • 汇编语言高手进,在线等,急
    答:(7)输入/输出指令是累加器专用指令,8位累加器是AL,不是AH 8、 VAR1 DW 3B ( 2个) ;说明:一个字占2个字节 VAR2 DW 5 DUP(2),0 ( 12个 ) ;说明:6个字12个字节 VAR3 DD —1,1,1 ( 12个) ;说明:3个双字12个字节 COUNT EQU 10 (0个 ); 说明:常量不占...
  • 微型计算机技术,请汇编语言高手指教~~~(4)
    答:控制字为82H(A口方式0输出,B口方式0输入,C口未用到)。程序段如下:MOV AL,82H OUT 0E6H,82H;送入控制字,初始化8255 AA: IN AL,0E2H;读入B口内容 NOT AL OUT 0E0H,AL;从A口输出与B口相反的电平 CALL DELAY;延时一定时间,使LED稳定点亮,假设有一延时程序可供调用 JMP SHORT AA;...
  • 汇编语言高手进
    答:BCD DB 5,7,9,2 添加了注释的代码如下 ;有个名为BUF的数组,保存了一串字符。;现要求将它的每个字符转换为对应的BCD码,并保存到名为BCD的数组中 DATA SEGMENT BUF DB '5792'BCD DB 4 DUP(?)DATA ENDS STACK SEGMENT DB 200 DUP(0)STACK ENDS CODE SEGMENT ASSUME DS:DATA,SS:STACK,CS:...