MOV+AH+01H++INT++21H+++ADD+AL++20H++MOV++DL++AL+++MOV++AH++02H++INT++21H输入A输出什么
时间: 2023-10-31 10:06:13 浏览: 188
这段代码是汇编语言,它的作用是将字符'A'输出到屏幕上,并在其后面输出一个空格。具体的执行过程如下:
1. MOV AH, 01H:将01H赋值给寄存器AH,表示接下来要进行键盘输入操作。
2. INT 21H:调用21H中断,等待用户输入一个字符。
3. ADD AL, 20H:将AL寄存器中的ASCII码加上20H,即将'A'转换为'a'。
4. MOV DL, AL:将AL寄存器中的值赋给DL寄存器,即将字符'a'的ASCII码存入DL寄存器。
5. MOV AH, 02H:将02H赋值给寄存器AH,表示接下来要进行屏幕输出操作。
6. INT 21H:调用21H中断,将DL寄存器中的字符输出到屏幕上。
7. 输出空格:执行ADD AL, 20H和MOV DL, AL两条指令后,AL寄存器中的值为' '的ASCII码,再次执行MOV AH, 02H和INT 21H两条指令即可将空格输出到屏幕上。
因此,最终输出的结果是"A "(注意有一个空格)。
相关问题
代码逐句注释code segment assume cs:code start: mov ax,cs mov ds,ax mov dx,offset int_proc mov ax,2572h int 21h mov dx,21h in al,dx and al,0fbh out dx,al in al,0a1h and al,0fbh out 0a1h,al mov dx,28bh mov al,0b8h out dx,al mov al,09h out dx,al mov bl,8 ll: jmp ll int_proc: mov dx,288h in al,dx mov dl,al mov ah,02h int 21h mov dl,0dh int 21h mov dl,0ah int 21h mov dx,20h mov al,20h out dx,al out 0a0h,al dec bl jnz next in al,21h or al,08h out 21h,al sti mov ah,4ch int 21h next: iret code ends end start
这段代码是一段汇编代码,主要作用是设置中断处理程序,并且在中断处理程序中输出一些信息。下面是每一行代码的注释:
```
code segment ; 定义代码段
assume cs:code ; 设置代码段寄存器
start: ; 开始标记
mov ax,cs ; 将代码段寄存器 CS 的值移动到通用寄存器 AX 中
mov ds,ax ; 将 AX 中的值移动到数据段寄存器 DS 中
mov dx,offset int_proc ; 将中断处理程序的偏移地址移动到 DX 中
mov ax,2572h ; 将 2572H 移动到 AX 中
int 21h ; 执行 DOS 中断 21h,将中断向量设置为 int_proc
mov dx,21h ; 将端口地址 21H 移动到 DX 中
in al,dx ; 从 DX 指定的端口读取一个字节到 AL 中
and al,0fbh ; 将 AL 中的值与 0FBH 按位与
out dx,al ; 将 AL 中的值输出到 DX 指定的端口
in al,0a1h ; 从端口地址 0A1H 读取一个字节到 AL 中
and al,0fbh ; 将 AL 中的值与 0FBH 按位与
out 0a1h,al ; 将 AL 中的值输出到端口地址 0A1H
mov dx,28bh ; 将端口地址 28BH 移动到 DX 中
mov al,0b8h ; 将值 0B8H 移动到 AL 中
out dx,al ; 将 AL 中的值输出到 DX 指定的端口
mov al,09h ; 将值 09H 移动到 AL 中
out dx,al ; 将 AL 中的值输出到 DX 指定的端口
mov bl,8 ; 将值 8 移动到 BL 中
ll: ; 标记 ll
jmp ll ; 无条件跳转到标记 ll
int_proc: ; 定义中断处理程序
mov dx,288h ; 将端口地址 288H 移动到 DX 中
in al,dx ; 从 DX 指定的端口读取一个字节到 AL 中
mov dl,al ; 将 AL 中的值移动到 DL 中
mov ah,02h ; 将值 02H 移动到 AH 中
int 21h ; 执行 DOS 中断 21h,将 DL 中的值输出到屏幕上
mov dl,0dh ; 将值 0DH 移动到 DL 中,即回车符
int 21h ; 执行 DOS 中断 21h,输出回车符
mov dl,0ah ; 将值 0AH 移动到 DL 中,即换行符
int 21h ; 执行 DOS 中断 21h,输出换行符
mov dx,20h ; 将端口地址 20H 移动到 DX 中
mov al,20h ; 将值 20H 移动到 AL 中
out dx,al ; 将 AL 中的值输出到 DX 指定的端口
out 0a0h,al ; 将 AL 中的值输出到端口地址 0A0H
dec bl ; 将 BL 中的值减 1
jnz next ; 如果 BL 不为 0,跳转到标记 next
in al,21h ; 从端口地址 21H 读取一个字节到 AL 中
or al,08h ; 将 AL 中的值与 08H 按位或
out 21h,al ; 将 AL 中的值输出到端口地址 21H
sti ; 开启中断
mov ah,4ch ; 将值 4CH 移动到 AH 中,即结束程序
int 21h ; 执行 DOS 中断 21h
next: ; 标记 next
iret ; 中断返回指令
code ends ; 代码段结束
end start ; 程序结束
DATA SEGMENT S2 DB ? S1 DB ? X DB 1 Y DB 1 S DB 0AH FCH=2AH FDH=3DH FKG=20H FHH=0AH FHC=0DH DATA ENDS STACK1 SEGMENT STACK DB 20H DUP(0) STACK1 ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK1 START:MOV AX,DATA MOV DS,AX MOV CL,9 LL1: PUSH CX ;将CL压入堆栈段 MOV CL,Y LL2: CALL L1 ;调用子程序L1 INC X LOOP LL2 MOV X,1 INC Y MOV DL,FHH ;输出换行和回车 MOV AH,2 INT 21H MOV DL,FHC MOV AH,2 INT 21H POP CX ;从堆栈段中取出CL LOOP LL1 MOV AH,4CH ;程序结束 INT 21H L1 PROC ;计算X*Y=Z并且输出X*Y=Z的子程序 MOV DL,X ADD DL,30H MOV AH,2 INT 21H MOV DL,FCH MOV AH,2 INT 21H MOV DL,Y ADD DL,30H MOV AH,2 INT 21H MOV DL,FDH MOV AH,2 INT 21H MOV AL,X MUL Y DIV S MOV S1,AH ADD AL,30H MOV DL,AL MOV AH,2 INT 21H ADD S1,30H MOV DL,S1 MOV AH,2 INT 21H MOV DL,FKG ;输出空格 MOV AH,2 INT 21H RET L1 ENDP ;子程序结束 CODE ENDS END START
这段代码是一个8086汇编语言程序,它实现了一个简单的乘法表输出功能。
首先,定义了几个变量:S2、S1、X、Y、S,它们都是8位的数据类型,用于存储一些中间结果和计数器等。
然后,定义了一些常量:FCH、FDH、FKG、FHH、FHC,它们的值分别是“*”、“=”、“ ”、“\n”、“\r”,用于在输出时作为分隔符或换行符使用。
接着,定义了一个堆栈,用于保存寄存器的值和程序的返回地址。
在主程序中,首先将数据段地址存入AX寄存器,然后将其赋值给DS寄存器,这样程序就可以访问数据段中的变量了。接着,将计数器CL的值设为9。
进入循环LL1,将CL的值压入堆栈段中。然后将CL的值赋给计数器Y,并且调用子程序L1。在L1中,将X和Y的值输出,然后计算X*Y并将结果存入S1中,最后将S1的值输出。在主程序中,将X加1,如果X小于等于9,则继续循环LL2,否则将X设为1,Y加1,输出换行和回车符,并且从堆栈段中取出CL的值。如果CL大于0,则继续循环LL1,否则程序结束。
总的来说,这段代码实现了一个简单的乘法表输出功能,输出的结果类似于以下形式:
1*1=1
1*2=2
...
9*8=72
9*9=81
阅读全文