编写完整的80868088汇编语言源程序,将字符串“Hello World!”中小写字母转换为大写字母。

编写完整的80868088汇编语言源程序,将字符串“Hello World!”中小写字母转换为大写字母。,第1张

DATA SEGMENT

T1 DB 'Hello World! $'

NUM EQU $ - T1

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE, DS: DATA

START:

MOV AX, DATA

MOV DS, AX

MOV AH, 9

LEA DX, T1

INT 21H

MOV BX, 0

MOV CX, NUM

LOP:

MOV AL, T1[BX]

CMP AL, 'a'

JB NEXT

CMP AL, 'z'

JA NEXT

SUB AL, 20h

MOV T1[BX], AL

NEXT:

INC BX

LOOP LOP

MOV AH, 9

LEA DX, T1

INT

MOV AH, 4CH

INT 21H

CODE ENDS

END START

MOV DX,OFFSET dest_buffer

int 21h

MOV AH,4CH

INT 21H

code ends

end start

code    segment

        assume cs:code

        org 100h

start:  jmp begin

array    db 100 dup(?)

sum      db 0

begin:  push cs

        pop ds

        push cs

        pop es

        lea si,array

        mov cx,100

        cld

@0:

        lodsb

        add byte ptr sum,al

        loop @0

        

        int 3

        mov ah,4ch

        int 21h

code    ends

        end start

1、程序如下:

codesegment

assume cs:code, ds:code, ss:code

org 100h

main: mov si,offset x 取数组中第一个元素的内存地址

mov cx,100 数组元素个数

cld 以下使用lodsb来获得各元素值,为此先清除方向标志

xor ah,ah 因x内全部为无符号数,所以将ah设为0,以便累加(根据 _fmlyht 意见从循环内移出以提高代码效率)

lab1: lodsb 从ds:si处取一个字节放入al中,同时si增1即指向下个元素

add sum,ax 累加

looplab1循环,前面对cx的赋值规定了循环次数为100次

int 20h 循环结束后sum中为总和,此处用int 20h退出

x db 100 dup (?) 定义100个字节型元素的数组,但不指定初值

sum dw 0 sum的初值为0,在程序代码部分中没有对该变量进行初始化,所以会使用这里定义的值为总和的初值

codeends

end main

2、代码如下:

cmp ax,bx 比较ax与bx

jge lab2若ax>=bx则转至lab2,带符号数比较须使用jg(e)/jl(e)/jng/jnl等指令

xchg ax,bx 根据 _fmlyht 意见,将ax与bx交换,如此,ax中为两者的较大值,bx为较小值

lab2: cmp ax,cx 执行到此时,ax中有最初时ax与bx中较大者,这时再比较ax与cx

jge lab3方法与前次类似,至lab3时ax将存有原来三者中最大的数

xchg ax,cx 没有跳转的话需将cx中较大的值与ax中较小的值交换以使ax中含最大值

lab3:

至此ax中已是三者中的最大值,下面代码是为完成中间值与最小值的排序,使三者从大到小分别存放于ax、bx、cx。原题无此要求,可去掉。

cmp bx,cx

jge lab4

xchg bx,cx

lab4:

至此,ax>=bx>=cx

----

谢谢楼下 _fmlyht 朋友指正,已在此答案中改进并注明。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12140685.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存