LEA DX显示不了数字
时间: 2023-12-21 17:04:40 浏览: 22
LEA指令是将一个内存地址加载到指定寄存器中,DX寄存器是用来存储I/O端口地址的寄存器,它是16位的。因此,LEA DX指令加载的是一个内存地址,而不是数字。如果你想在屏幕上显示数字,你可以使用INT 21H中断来调用DOS的输出函数,比如AH=02H或AH=09H。你可以将数字存储在寄存器中,然后将其转换为ASCII码并输出到屏幕上。
相关问题
修改下列代码,要求实现:如果字符串2长度大于等于字符串1,则输出字符串1,如果字符串2长度小于字符串1,则补齐字符串2长度到字符串1,补足部分XXXX.DATA SEGMENT TIP1 DB 0DH,0AH, 'PLEASE INPUT STRING1 END BY ENTER:' ,'$' TIP2 DB 0DH,0AH, 'PLEASE INPUT STRING1 END BY ENTER:' ,'$' TIP3 DB 0DH,0AH, 'MATCH','$' TIP4 DB 0DH,0AH, 'NOT MATCH','$' TIP5 DB 0DH,0AH, 'PRESS ENTER TO EXIT ','$' BUFF1 DB 101,0,101 DUP(0) BUFF2 DB 101,0,101 DUP(0) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV ES,AX;数据段和堆栈段初始化 LEA DX,TIP1 MOV AH,9 INT 21H;DISPLAY TIP1 LEA DX,BUFF1 MOV AH,0AH INT 21H;输入第一个字符串到BUFF1缓冲区 LEA DX,TIP2 MOV AH,9 INT 21H LEA DX,BUFF2 MOV AH,0AH INT 21H;输入第二个字符串到BUFF2缓冲区 LEA SI,BUFF1;第一个字符串首址给SI LEA DI,BUFF2;第二个字符串首址给DI MOV CX,53 CLD;地址递增 REPZ CMPSB;字符串比较 JZ MATCH;相等输出MATCH LEA DX,TIP4 MOV AH,9 INT 21H;不等输出NOT MATCH JMP EXIT MATCH: LEA DX,TIP3 MOV AH,9 INT 21H;DISPLAY TIP1 JMP EXIT EXIT: LEA DX,TIP5 MOV AH,9 INT 21H MOV AH,1 INT 21H CMP AL,13 JZ AA JMP START AA: MOV AH,4CH INT 21H CODE ENDS END START
修改后的代码如下:
```
DATA SEGMENT
TIP1 DB 0DH,0AH,'PLEASE INPUT STRING1 END BY ENTER:','$'
TIP2 DB 0DH,0AH,'PLEASE INPUT STRING2 END BY ENTER:','$'
TIP3 DB 0DH,AH,'MATCH','$'
TIP4 DB 0DH,0AH,'NOT MATCH'
TIP5 DB 0DH,0AH,'PRESS ENTER TO EXIT','$'
BUFF1 DB 101,0,101 DUP(0)
BUFF2 DB 101,0,101 DUP(0)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV ES,AX ; 数据段和堆栈段初始化
LEA DX,TIP1
MOV AH,9
INT 21H ; 显示提示信息1
LEA DX,BUFF1
MOV AH,0AH
INT 21H ; 输入第一个字符串到BUFF1缓冲区
LEA DX,TIP2
MOV AH,9
INT 21H ; 显示提示信息2
LEA DX,BUFF2
MOV AH,0AH
INT 21H ; 输入第二个字符串到BUFF2缓冲区
LEA SI,BUFF1 ; 第一个字符串首址给SI
LEA DI,BUFF2 ; 第二个字符串首址给DI
MOV CX,100 ; 设定比较长度为100
CLD ; 地址递增
REPZ CMPSB ; 字符串比较
JZ MATCH ; 相等输出MATCH
; 不相等,判断字符串2长度
MOV CX,0 ; 清零CX
MOV AL,BUFF2[1] ; 获取字符串2长度
SUB AL,30H ; 转换成数字
CMP AL,100 ; 判断长度是否大于100
JGE MATCH ; 如果大于等于100,则直接输出MATCH
; 字符串2长度不足100,补齐长度
MOV CL,AL ; 字符串2长度赋值给CX
MOV CH,0 ; CX的高位清零
MOV AL,' ' ; 空格填充
SUB CX,100 ; 计算需要填充的长度
JZ MATCH ; 如果不需要填充,则直接输出MATCH
; 开始填充
ADD DI,CX ; DI指向需要填充的位置
REP STOSB ; 填充
JMP MATCH ; 输出MATCH
EXIT:
LEA DX,TIP5
MOV AH,9
INT 21H ; 显示提示信息5
MOV AH,1
INT 21H ; 等待用户按下回车键
CMP AL,13
JZ AA
JMP START
AA:
MOV AH,4CH
INT 21H
CODE ENDS
END START
```
修改说明:
1. 将比较长度从53改为100,以适应更长的字符串。
2. 在比较不相等时,判断字符串2的长度,如果小于100,则补齐长度。
3. 填充使用了字符串操作指令STOSB。
请把每行后面加上注释。DATA SEGMENT ;定义数据段 INFON DB 0DH,0AH,'PLEASE INPUT A YEAR: $' Y DB 0DH,0AH,'THIS IS A LEAP YEAR! $' N DB 0DH,0AH,'THIS IS NOT A LEAP YEAR! $' W DW 0 BUF DB 8 DB ? DB 8 DUP(?) DATA ENDS STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS CODE SEGMENT ; ASSUME DS:DATA,SS:STACK,CS:CODE; START:MOV AX,DATA ; MOV DS,AX ; LEA DX,INFON ;在屏幕上显示提示信息 MOV AH,9 INT 21H LEA DX,BUF ;从键盘输入年份字符串 MOV AH,10 INT 21H MOV CL, [BUF+1] LEA DI,BUF+2 CALL DATACATE CALL IFYEARS JC A1 LEA DX,N
```assembly
; 定义数据段
DATA SEGMENT
INFON DB 0DH,0AH,'PLEASE INPUT A YEAR: $' ; 提示信息
Y DB 0DH,0AH,'THIS IS A LEAP YEAR! $' ; 是闰年的提示信息
N DB 0DH,0AH,'THIS IS NOT A LEAP YEAR! $' ; 不是闰年的提示信息
W DW 0 ; 存储年份
BUF DB 8 ; 存储输入的字符串
DB ? ; 存储输入的字符串长度
DB 8 DUP(?) ; 存储输入的字符串内容
DATA ENDS
STACK SEGMENT
DB 200 DUP(0) ; 栈空间
STACK ENDS
CODE SEGMENT
; ASSUME DS:DATA,SS:STACK,CS:CODE;
START:
MOV AX,DATA ; 将数据段地址存入 AX 寄存器
MOV DS,AX ; 将 AX 中的数据段地址存入 DS 寄存器
LEA DX,INFON ; 将提示信息的地址存入 DX 寄存器
MOV AH,9 ; 设置 AH 寄存器为 9,表示调用 DOS 的 "显示字符串" 功能
INT 21H ; 调用 DOS 的中断 21H,显示提示信息
LEA DX,BUF ; 将缓冲区地址存入 DX 寄存器,准备接收用户输入的年份字符串
MOV AH,10 ; 设置 AH 寄存器为 10,表示调用 DOS 的 "读取字符串" 功能
INT 21H ; 调用 DOS 的中断 21H,读取用户输入的年份字符串
MOV CL, [BUF+1] ; 将输入的字符串长度存入 CL 寄存器
LEA DI,BUF+2 ; 将输入的字符串内容的地址存入 DI 寄存器
CALL DATACATE ; 调用 DATACATE 子程序,将输入的字符串转换为数字,存入 W 变量中
CALL IFYEARS ; 调用 IFYEARS 子程序,判断年份是否是闰年
JC A1 ; 如果是闰年,则跳转到 A1 标签
LEA DX,N ; 如果不是闰年,则将不是闰年的提示信息的地址存入 DX 寄存器
A1:
; 其他操作
CODE ENDS
```