汇编:字符串的输出

在16位汇编程序中,可以使用DOS中断21h的功能号09h来打印字符串;下面是一个简单的示例程序,演示了如何在16位汇编程序中打印字符串:

复制代码
assume cs:code,ds:data
​
data segment
    szBuffer db 0dh,0ah,'HelloWorld$'  //定义字符串
data ends
​
code segment
start:
    mov ax,data  ; 将数据段地址加载到AX寄存器中
    mov ds,ax    ; 将AX中的数据段地址加载到DS寄存器中
                (`DS` 寄存器是一个段寄存器,用于存储数据段的地址。)
    
    mov dx,offset szBuffer  ; 将szBuffer的偏移地址加载到DX寄存器中 
    mov ah,09h    ; DOS功能号09h,用于显示字符串
    int 21h       ; 调用DOS中断21h
​
    mov ax,4c00h  
    int 21h
    
code ends
end start

assume cs:code, ds:data:指令告诉汇编器代码段位于 cs 寄存器所指示的代码段中,数据段位于 ds 寄存器所指示的数据段中。

data segmentdata ends 之间的部分是数据段。在这里,szBuffer 被定义为一个字符串,以 $ 结尾。

0dh0ah 是 ASCII 字符集中的转义序列,分别代表回车(Carriage Return)和换行(Line Feed)。

  • 0dh 对应于回车字符,表示将光标移动到当前行的开头,但不换行。通常与 0ah 结合使用,表示回车换行,即在显示文本时,光标移到下一行的开头。

  • 0ah 对应于换行字符,表示将光标移动到下一行的开头。

code segmentcode ends 之间的部分是代码段。在 start 标签处开始执行。

mov ax, data:将数据段地址加载到 AX 寄存器中。

mov ds, ax:将 AX 中的数据段地址加载到 DS 寄存器中,这样程序就可以访问数据段中的数据。

mov dx, offset szBuffer:将 szBuffer 的偏移地址加载到 DX 寄存器中;offset 操作符用于获取标签(如变量或标签)的偏移地址。

mov ah, 09h:将 09h 存储在 AH 寄存器中,该值表示调用 DOS 中断 21h 的功能号 09h,用于显示字符串。

int 21h:调用 DOS 中断 21h,显示字符串。

使用ML.exe对汇编程序进行处理后,执行处理后生成的exe程序,得到结果:

上述代码中我们使用OFFSET操作符将szBuffer字符串变量的地址偏移值计算出来,接着使用mov指令将偏移值移入dx寄存器中,接着使用DOS中断21h的功能号09h来打印字符串,即将功能号09h传入ax寄存器的高地址寄存器ah中,最后使用int 21h调用中断执行打印字符串的操作。

但其实在计算字符串的地址时除了使用OFFSET操作符之外,我们还可以使用lea指令取获取字符串的有效地址。

LEA指令

LEA指令(Load Effective Address)是x86汇编语言中的一条指令,用于将一个有效地址加载到寄存器中。它的主要用途是计算地址,但不进行内存访问。

语法
复制代码
LEA destination, source
  • destination 是一个寄存器,用于存储计算出的地址。

  • source 是一个内存操作数,表示需要计算的有效地址。

此时我们使用lea指令获取字符串的有效地址,并调用中断将其打印

复制代码
assume cs:code,ds:data
​
data segment
    szBuffer db 0dh,0ah,'HelloWorld$'
data ends
​
code segment
start:
    mov ax,data
    mov ds,ax
    
    //打印字符串
    mov ah,09h
    lea dx,szbuffer
    int 21h
    int 21h ;再次调用中断打印字符串
    mov ax,4c00h
    int 21h
    
code ends
end start
  • lea dx, szBuffer:将 szBuffer 的偏移地址加载到 DX 寄存器。

  • int 21h:调用DOS中断21h,打印以 $ 结束的字符串。

  • int 21h:再次调用中断,重复打印字符串。

最后运行该程序生成的exe文件:

相关推荐
ThornArmor15 小时前
【工具篇·番外】跨语言生态的主权回收:基于 ISA 说明书的 4-bit 双向汇编系统全线封顶
c语言·开发语言·汇编·c++·重构·架构
是星辰吖~1 天前
WIN32_线程(下)
汇编
是星辰吖~2 天前
WIN32_线程(上)
汇编
AI科技星2 天前
数术工坊 · 第四卷 橡皮泥江湖(拓扑学)【完整定稿】
c语言·开发语言·汇编·electron·概率论·拓扑学
iCxhust3 天前
C# 生成命令行程序 将hex格式烧录程序转换成bin烧录格式
开发语言·汇编·单片机·嵌入式硬件·c#·微机原理
iCxhust3 天前
C#进程管理程序
开发语言·汇编·stm32·单片机·c#·微机原理
hhcgchpspk3 天前
汇编语言传递数据和地址的误区
汇编·笔记·nasm·masm
iCxhust3 天前
MTK8088单板机制作(一)时钟电路
汇编·单片机·嵌入式硬件·微机原理·8088单板机
iCxhust4 天前
8086 汇编位测试使用方法
汇编·单片机·嵌入式硬件·微机原理·8088单板机
iCxhust4 天前
用汇编在8088单板机上创建一个进程
汇编·微机原理