汇编语言如何用 mov ah,09h int 21h 输出字符串
时间: 2024-01-30 19:01:48 浏览: 310
在汇编语言中,使用 `mov ah,09h` 将 `ah` 寄存器的值设置为 `09h`,它表示打印字符串的功能。然后使用 `int 21h` 指令调用 DOS 中断 21h,以执行打印字符串的操作。
下面是一个示例程序,它打印字符串 "Hello, world!":
```
.model small
.stack 100h
.data
msg db 'Hello, world!', '$'
.code
main proc
mov ax, @data
mov ds, ax
mov ah, 09h ; 设置打印字符串的功能
lea dx, msg ; 将 DX 寄存器设置为字符串的地址
int 21h ; 调用 DOS 中断 21h,打印字符串
mov ah, 4ch ; 设置程序退出的功能
int 21h ; 调用 DOS 中断 21h,结束程序
main endp
end main
```
在上面的程序中,使用 `lea dx, msg` 指令将 `dx` 寄存器设置为字符串的地址,`msg` 是在 `.data` 段中定义的字符串变量。然后,使用 `int 21h` 指令调用 DOS 中断 21h,以执行打印字符串的操作。
最后,使用 `mov ah, 4ch` 和 `int 21h` 指令退出程序。
相关问题
分析data segment buf db 30; real db 0; arry db 30 dup(24h); data ends code segment assume cs:code,ds:data start: mov ax,data; mov ds,ax; lea dx,buf; 输入字符串到缓冲区 mov ah,0ah; int 21h; mov dx,0 lea dx,arry; 输出缓冲区的字符串 mov ah,09h; int 21h; mov dl,0dh mov ah,2 int 21h mov dl,0ah mov ah,2 int 21h mov cx,22 lea si,buf loop lop jmp out lop: LODSB cmp al,20h je dig cmp al,30h jl ifend cmp al,39h jle dig cmp al,41h jle exit cmp al,5ah jl dig cmp al,61h jl exit cmp al,7Ah sub al,20h dig: mov dl,al mov ah,2 int 21h jmp lop ifend: cmp al,24h jne lop je isend isend: mov dl,0dh mov ah,2 int 21h mov dl,0ah mov ah,2 int 21h ;给缓冲区排序 out: mov cl,real mov ch,0 mov di,cx lp1:mov cx,di mov bx,0 lp2:mov al,arry[bx] cmp al,arry[bx+1] jle cont xchg al,arry[bx+1] mov arry[bx],al cont:inc bx loop lp2 dec di jnz lp1 ;输出排序好的字符串 lea dx,buf mov ah,9 int 21h exit: mov ah,4ch; int 21h; code ends end start
这段代码是一个汇编语言程序,它定义了一些数据段和代码段,并实现了一个字符串输入、排序和输出的功能。
在数据段中,`buf`是一个大小为30的缓冲区,`real`是一个字节,`arry`是一个大小为30,每个元素占用一个字节,初始化为24h。在代码段中,程序首先将数据段的地址赋给`ds`寄存器,然后使用`int 21h`中断调用来输入字符串到缓冲区。接着,程序使用`int 21h`中断调用来输出缓冲区中的字符串,并加上换行符。接下来,程序使用一个循环来遍历缓冲区中的字符,将字符转换成大写后输出。如果字符是空格,则跳过;如果字符是数字或大写字母,则直接输出;如果字符是小写字母,则将其转换成大写后输出。最后,程序使用冒泡排序算法对缓冲区中的字符进行排序,并使用`int 21h`中断调用来输出排序后的字符串。
需要注意的是,这段代码可能存在一些问题或不足之处,例如没有对输入的字符串长度进行检查,可能会造成缓冲区溢出;排序算法使用的是冒泡排序,效率不高;输出排序后的字符串时没有加上换行符等。
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
阅读全文