汇编语言16位汇编

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

参数传递
assume cs:code,ds:data,ss:stack
stack segment
db 16 dup(0)
;地址段076A
stack ends
data segment
strmess db 'reqrew323',0 ;地址段076B
len dw 8 dup(0)
;地址段076B
data ends
pop si
pop ds
pop bp
ret
strlen endp
code ends end start
参数传递
4、 利用call后续区传递参数
CALL后续区是指位于CALL指令后的存储区域。主程序在调用子程序之前,把入口参数存入 CALL指令后的存储单元中,子程序根据保存在堆栈中返回地址找到入口参数,这种传递参数的 方法称为CALL后续去传递参数法。由于数据和代码混在一起,此方法实际使用的不多。
......
;子程序名:strlwr
;功能:把字符串中的大写字母改写小写字母
;入口参数:字符串的起始地址的段值和偏移在CALL后续区
;出口参数:无
;------------------------------------------------------
strlwr proc
push bp
mov bp,sp
;保护寄存器
push si
;执行如图4.4(c)
mov ds,[bp+6] ;取入口参数
mov si,[bp+4] ;
mov al,0
strlen1:
cmp al,[si]
;判断是否找到结束标志0
jz strlen2
inc si
jmp strlen1
strlen2:
mov ax,si
sub ax,[bp+4] ;计算字符串长度
课后练习
3、如果利用堆栈传递参数,那么有两种平衡堆栈的方法,请比较这两种方法 4、编写一个利用查表的方法实现把1位十六进制数转换为对应ASCII码的程序。出入 口参数传递的方法自定 5、按要求分别编写实现如下功能的程序:把由十进制数ASCII码组成的字符串转换 为对应的数值。过程SUBA通过寄存器传递入口参数 ,通过寄存器传递出口参数。过程SUBB通过堆栈传递入口参数,通过寄存器传递出 口参数。过程SUBC通过堆栈传递入口参数,通过堆栈 传递出口参数。作为入口参数的字符串首地址由段值和偏移构成,其他参数或要求 自定。 6、按要求分别编写实现如下功能的程序:把16位二进制数转换为对应十进制数 ASCII码串。作为入口参数的二进制数是有符号的,采用补码形式表示。 通过堆栈传递入口参数。过程SUBA是近过程,堆栈由主程序平衡。过程SUBB是近 过程,堆栈由子程序平衡。过程SUBC是远过程,堆栈由主程序平衡。 过程SUBD是远过程,堆栈由子程序平衡。 7、编写具有如下功能的程序:把32位无符号二进制数转换为对应十进制数ASCII码 串。作为入口参数的指示存放ASCII码串缓冲区首地址由段值和偏移两部分构成,其 他具体要求与题6相同。
;压入IP或CS:IP,和返回地址 ;恢复堆栈平衡
mov ax,4c00h int 21h
参数传递
;子程序名:strlen
;功能:测量字符串的长度
;入口参数:字符串起始地址的段值和偏移值在堆栈中
;出口参数:AX=字符串的长度
strlen proc
push bp
mov bp,sp
;为取参数做准备
push ds
第一篇汇编语言 16wk.baidu.com汇编
第二节
第三部分汇编语言程序设计基础
子程序设计 ●子程序设计 ● ●递归和重入
参数传递
3、利用堆栈传参
主程序在调用子程序之前,先将需要传递的参数依次压入堆栈,子程序从堆栈取出入口参数 使用堆栈传递出口参数,子程序在返回前,需要返回的参数存入堆栈,主程序在堆栈中取出出口 参数 优点:不占用寄存器,不使用额外内存单元 缺点:参数和子程序的返回地址混在一起,需要考虑保护寄存器,所以较为复杂 通常利用堆栈传递入口参数,而利用寄存器传递出口参数。 ;利用堆栈传参 ;例5:写一个测量字符串长度的子程序 ;程序名:t4-3.asm ;功能:测试程序 ;-----------------------------------
push ax
push si
push ds
mov si,[bp+2]
;从堆栈中取得返回地址,见图
mov ds,cs:[si+2];取入口参数-段值
mov si,cs:[si]
;取入口参数偏移
strlwr1:
mov al,si
cmp al,0
jz strlwr3
cmp al,'A'
jb strlwr2
参数传递
;例6:写一个字符串中的大写字母改写为小写字母的子程序(近过程)。设字符串以0结尾。CALL后续去传递字符串的起始地址的段 值和偏移
主程序片段: ;......
call strlwr
;调用子程序
dw offset strmess
;传递字符串偏移
dw seg dseg
;传递字符串段值
cont:
cmp al,'Z'
ja strlwr2
add al,'a'-'A'
mov [si],al
参数传递
strlwr2: strlwr3:
strlwr endp
inc si jmp strlwr1
add word ptr [bp+2],4 pop ds pop si pop ax pop bp ret
;修改返回地址图4.5c 执行CALL指令,SP-4,此时恢复平衡
code segment start:
;地址段076C
mov ax,stack
mov ss,ax
mov sp,10h
mov ax,data
mov ds,ax
push ds
;压入字符串段值
mov si,offset strmess
push si
;压入字符串偏移
call strlen add sp,4 mov len,ax
相关文档
最新文档