汇编语言-王爽(第三版)实验11 编写子程序 笔记

这篇笔记介绍了如何编写一个汇编语言子程序,该程序接收一个以0结尾的字符串,将其中的小写字母转换成大写字母。通过设置指针、判断字符是否为0及是否在指定ASCII范围内实现转换,遵循do-while编程思想,避免使用cx和loop指令。

 编写一个子程序,将包含任意字符,以0结尾的字符串中的小写字母转变为大写字母,描述如下:

名称:letterc

功能:将以0结尾的字符串中的小写字母转变为大写字母

参数:di:si指向字符串首地址

整体思路:

1.设置好指向字符串的指针

2.call进入子程序

3.结束

子程序思路:

1.将字符放置在一个字节型寄存器中,例如bl

2.cmp判断当前字符是否为0,如果为0,则跳转到退出子程序的指令处

3.cmp判断当前字符是否在【97,122】范围内,如果不在,那么处理下一个字符

4.退出子程序的指令ret

注意:

1.由于题目要求转化的是字符串的小写字母,而不是其他字符(标点符号不能转化),因此要限定字符的ASCII范围

2.为了便于书写,将内存数据放在字节型寄存器中,自动匹配需要取得的内存长度

3.因为不考虑字符串长度,不适用cx和loop指令,而是使用类似do-while的编程思想,即,直接使用jmp指令

DATAS SEGMENT
	db "Beginner's All-purpose Symbo
<think>好的,用户需要查找王爽汇编语言》第四版实验十关于编写子程序的示例代码或教。首先,我得回忆一下实验十的具体内容。实验十主要涉及子程序的设计,结合call和ret指令的使用。用户可能正在学习如何编写子程序,需要示例代码和步骤指导。根据之前的引用,引用[2]提到call和ret指令用于子程序设计,属于基础内容。引用[3]讨论了宏与子程序的区别,可能相关。需要确认实验十的具体任务,通常是显示字符串、数值转换等子程序编写。 接下来,我应该整理实验十的步骤:安装中断例、参数传递(寄存器或内存)、保存现场、子程序功能实现、恢复现场。示例代码需要展示如何用寄存器传递参数,比如显示字符串。可能需要使用int10h的BIOS中断,但用户可能更关注子程序结构。注意用户需要的是示例代码,所以应该用汇编语法正确编写,比如使用masm的格式。同时,要提到调试时需要注意数据标号的地址问题,如引用[1]中提到的转移代码时的地址问题,可能涉及数据段正确设置。最后,生成相关问题,帮助用户深入理解子程序参数传递、调试方法、与宏的区别等,参考之前的引用内容。确保回答结构清晰,步骤明确,符合用户需求。</think>### 汇编语言王爽第四版)实验子程序设计指导 实验十的核心目标是掌握**子程序的设计与调用**,重点涉及参数传递、寄存器保护和功能实现。根据书中内容和引用资料,实验十可能包含以下任务: - **编写显示字符串子程序**(例如在指定位置显示特定颜色字符串- **数值转换子程序**(如将二进制数转换为十进制ASCII码) - **通过寄存器或内存传递参数**(参考引用[3]中宏与子程序的参数传递差异) --- #### 示例代码框架(显示字符串子程序) ```assembly assume cs:code, ds:data data segment str db 'Hello, Assembly!$' ; 字符串以$结尾 data ends code segment start: mov ax, data mov ds, ax mov si, offset str ; 参数1:字符串地址存入SI mov dh, 8 ; 参数2:行号 mov dl, 3 ; 参数3:列号 mov cl, 2 ; 参数4:颜色属性(02h为绿色) call show_str ; 调用子程序 mov ax, 4c00h int 21h show_str proc push ax ; 保护寄存器 push es push di mov ax, 0b800h ; 显存段地址 mov es, ax ; 计算目标显存偏移地址:行号×160 + 列号×2 mov al, 160 mul dh mov di, ax add di, dx add di, dx ; di = dh*160 + dl*2 show_loop: mov al, [si] cmp al, '$' ; 判断字符串结束符 je show_end mov es:[di], al ; 写入字符 mov es:[di+1], cl ; 写入颜色属性 inc si add di, 2 jmp show_loop show_end: pop di ; 恢复寄存器 pop es pop ax ret show_str endp code ends end start ``` --- #### 关键步骤说明 1. **参数传递**:通过寄存器`SI`(字符串地址)、`DH`(行号)、`DL`(列号)、`CL`(颜色)传递参数[^3]。 2. **显存操作**:显存段地址为`0B800h`,每个字符占2字节(ASCII+属性)。 3. **寄存器保护**:子程序开头通过`push`保护寄存器,结尾通过`pop`恢复[^2]。 4. **结束符判断**:字符串以`$`结尾,避免越界访问。 --- #### 调试要点(参考引用[1]) - **标号地址问题**:若子程序未正确执行,检查`call`指令是否跳转到正确的标号地址。 - **段寄存器设置**:确保`DS`指向数据段,`ES`指向显存段。 - **参数覆盖风险**:子程序中若修改了参数寄存器(如`SI`、`CX`),需提前保存原始值。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值