汇编语言编程作业——第四章

15 篇文章 0 订阅
7 篇文章 0 订阅

 汇编语言编程作业——第四章

 题目1

编写程序,在数据段中定义一串字符串如“abcdefg”,将该字符串逆向存储,即变为“gfedcba”,并输出到屏幕上。

运行结果

代码

;把abcdefg存在0~6h,在8~fh保存逆置之后的字符串
DATAS SEGMENT
    db 'abcdefg'
    db  8 dup(0)
DATAS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS
START:
    MOV AX,DATAS
    MOV DS,AX
    mov es,ax
    
    mov di,0eh
    mov bx,0
    mov cx,7
    mov dx,10h
s:
    mov al,[bx]
    mov [di],al   ;逆置保存字符 
    add bx,1
    sub di,1
    loop s

    mov cx,7
    mov bx,8h
    
print:       ;输出显示
    MOV dl,[bx]
    mov ah,2h
    int 21h
    add bx,1
    loop print
    
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START


 题目2

1.如上题的字符串,编写程序,在字符串中查找字符“d”所在的位置。

运行结果:

注意:
位置打印的是在字符串的第几位

DATAS SEGMENT
    x db 'abcdefg'
DATAS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS    
START:
    MOV AX,DATAS
    MOV DS,AX
    
    mov cx,7
    mov bx,0
search:
    mov dh,[bx]
    cmp dh,'b'    ;和'b'进行比较
    jz find
    inc bx
    loop search   
    cmp cx,0
    jz finish
find:
    mov dl,bl      ;找到之后进行输出
    dec dl
    add dl,30h
    mov ah,02h
    int 21h

finish:
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START

 题目3

字符串查找程序,数据段中定义两个字符串str1,str2,str1的长度大于str2,编写程序,在str1中查找是否存在str2,是,则返回str2首字符在str1中的位置(从0开始),否则返回-1。

运行结果

注意
有压栈操作一定要有配套的弹栈操作

DATAS SEGMENT
    sbuffer    db    'helloworldhelloworld$'
    dbuffer db    'world$'
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    mov es,ax
    
    mov    si,offset sbuffer
    mov    di,offset dbuffer
    cld
    mov    cx,16     ;比较10次
again:    
    push    cx
    push    si    ;si入栈
            
    mov    cx,5      ;字符串长度
    repz cmpsb       ;开始比较

    jz    yes

    pop    si       ;si出栈
    inc    si       ;指向下一个字符
    mov    di,offset dbuffer      ;di初始化为第一个字符
    pop    cx       ;cx出栈并且减1
    loop    again     ;循环
    
    jmp    no        ;跳转到no

yes:    ;显示第一次出现的位置
    pop dx
    pop cx
    add dx,30h
    mov    ah,02h
    int    21h
    jmp e

no:     ;显示-1
    pop dx
    pop cx
    
    mov    dl,2dh
    mov    ah,02h
    int    21h
    mov    dl,31h
    mov    ah,02h
    int    21h
    
e:
    mov    ah,4ch
    int    21h


CODES ENDS
    END START

 题目4

编写字符串显示子程序DispString,参数为字符串的地址,字符串用’0’结束。

DATAS SEGMENT
    x db 'abcdefg',0
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    
    mov bx,offset x
    call Dispstring
    
    
    MOV AH,4CH
    INT 21H
    
Dispstring proc
    mov cx,7
s:
    mov dl,[bx]
    cmp dl,'0'  ;判断字符串是否结束
    jz return
    mov ah,02h   ;逐个字符显示
    int 21h
    inc bx
    loop s
return:
    ret
Dispstring endp
        
CODES ENDS
    END START
    
    

 题目5

编写二进制到十进制字符串转换子程序Bin2DecString,参数1为待转换的数据,长度为16位,参数2为字符串缓冲区地址,完成将参数1的数据转换为十进制字符串,存到参数指定的地址处,字符串结尾用’0’表示。

假设
假设计算11+9,显示结果,以字符串形式输出
如果要修改,可以改两个操作数

DATAS SEGMENT
    sum db 0,0
    mesg db '11+9='
    result db 0,0,'$'
    n1 db 9     ;操作数1
    n2 db 11     ;操作数2
DATAS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS
START:
    MOV AX,DATAS
    MOV DS,AX
    
start1:
    
    mov bx,offset sum
    mov ah,n1
    mov al,n2
    add ah,al
    mov [bx],ah
    call change
    mov ah,9
    mov dx,offset mesg
    int 21h

    
    
    MOV AH,4CH
    INT 21H
    
    
change proc
last:
    
    CMP byte ptr [BX],10  ;和10作比较,如果大于10,减10,同时十位加1
    JC next
    sub byte ptr [bx],10
    inc byte ptr [bx+7]
    jmp last

next:
    mov cl,[bx]
    add byte ptr [bx+8],cl      ;显示
    add byte ptr [bx+7],30h
    add byte ptr [bx+8],30h
    ret
change endp
    
CODES ENDS
    END START
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值