汇编语言程序设计

2024-12-20 11:04:22
推荐回答(4个)
回答1:

1. 串操作指令、处理器控制指令-位控制指令
在某一字符串中搜寻是否有字符A,若有,则把搜索次数记录下来,送到BX中;若无,则将BX清0。设字符串起始地址偏移量为00H,字符串长度为n。

MOV DI,0000H //字符串初始地址放入寄存器DI中
MOV CX,n //字符串长度放入CX中
MOV AL,'A' //要查找的字母A放入AL中
CLD//清除方向标志位
REPNE SCASB//以上都是指令REPNE SCASB的指令要求。。。可以参考该指令用法,作用是不相等则重复比较
JZ FOUND //有条件跳转转移 CX为零则执行标号FOUND处的指令
MOV DI,00H//赋值DI为00H
FOUND: MOV BX,DI//DI值赋给BX
HLT//停止 关键是REPNE SCASB指令

2.条件转移指令
AX中存放的无符号数,若为偶数,则直接除以2;若为奇数,则加1再除以2。

TEST AX, 0001H //AX中的数与0001H做逻辑与运算 但不影响AX的值
JZ EVEN //如果结果为0则AX中为偶数跳转到EVEN
ADD AX,1 //AX中的数加1
EVEN: SHR AX,1 //AX中的数右移一位 相当于除以2

3. 循环指令
若在存储器的数据段中有100个字节构成的数组,要求从该数组中找出“$”字符,然后将“$”字符前面的所有元素相加,结果保留在AL寄存器中。
MOV CX,100 //将100赋值给计数寄存器CX
MOV SI,00FFH //初始地址00FFH赋值给SI
L1:INC SI //将SI中的值加1
CMP BYTE PTR[SI],’$’ //当前地址的一字节数据与$做比较
LOOPNE L1 //不相等继续执行L1

SUB SI,0100H //SI中的数据减去100
MOV CX,SI //SI 赋值给CX
MOV SI,0100H
MOV AL,[SI] //以SI中的数据做地址寻址找到数据赋值给AL
DEC CX //CX 减去1
L2: INC SI //将SI中的数加1
ADD AL,[SI] 用SI相对寻址得到的数据与AL中的数据相加
LOOP L2 循环执行L2一直到CX为0
HLT

最后这个我不是很明白
我认为该这样写
MOV CX,100
MOV SI,00FFH
L1:INC SI
CMP BYTE PTR[SI],’$’
LOOPNE L1

SUB SI,00FFH //更改了这。。。00FF应该是起始地址 为什么原程序减去的是100呢。。不理解
MOV CX,SI //当前SI值应该是$所在的地址 减去00FFH就成了$之前的字节数 然后赋值给CX
MOV SI,00FFH
MOV AL,[SI]
DEC CX
L2: INC SI
ADD AL,[SI]
LOOP L2
HLT

回答2:

一、
MOV DI,0000H ;让ds:di指向字符串
MOV CX,n ;设置循环次数
MOV AL,'A' ;设置扫描的字母
CLD ;设置df为0
REPNE SCASB ;开始扫描
JZ FOUND ;找到则跳转
MOV DI,00H ;没找到则让di指向字符串开头
FOUND: MOV BX,DI ;让bx记录A所在位置
HLT ;处理器暂停

二、
TEST AX, 0001H ;判断最后一位是否为一
JZ EVEN ;为一,是奇数,跳转
ADD AX,1 ;是偶数,加一
EVEN: SHR AX,1 ;右移一位,相当于除2

三、
MOV CX,100 ;设置循环次数
MOV SI,00FFH ;di指向字符串的前一个字节
L1:INC SI
CMP BYTE PTR[SI],’$’
LOOPNE L1 ;di指向下一个字节,如果它不是$而且循环次数未到,则转到L1继续循环;

SUB SI,0100H
MOV CX,SI
MOV SI,0100H ;指向第一个字符
MOV AL,[SI] ;把第一个字符送入al
DEC CX ;指向前一个字符
L2: INC SI ;指向下一个字符
ADD AL,[SI] ;把字符加到al
LOOP L2 ;如果次数没到则转L2继续
HLT ;处理器暂停

回答3:

data segment
n db 5
result dw ?
data ends
code segment
assume ds:data,cs:code
start:
mov ax,data
mov ds,ax
mov cl,n
mov ch,0
mov al,1
next:
mul cl
loop next
mov result,ax
mov ax,4c00h
int 21h
code ends
end start

回答4: