微机汇编语言三道小题,求高手解答

1
编写程序对在数据段BUF1地址起存放一串字符个数进行统计,串结束标志为-1,并将统计
的结果放到CX中。
2
若在0500H单元有一个数x,把此数的前四位变反,后四位维持不变,送回同一单元。
3
编写子程序。求内存中一无符号字节型数据序列的最大值和最小值。该无符号字节型数据序列的起始地址位于SI中,数据个数位于CX中。要求求得的最大值存放于AH中,最小值存放于AL中。主程序调用子程序实现上述功能。

注意:请用最基本的语句,不要网上能搜到的那个,满意会加分。

1.assume cs:code, ds:data
data segment
BUF1 db 12,45,98,7,5,-3,6,-2,9,4,4,5,8,4,21,2,45,12,5,4,3,5,75,2,1,5,7,-1
data ends
code segment
start:
mov ax, data
mov ds, ax
mov es,ax
lea di, BUF1
mov cx, 65535
mov al,-1
cld
repne scasb ;但al-(di) == 0, 即al = (di)是跳出循环, 或者cx=0时, 跳出循环, 所以当(di)=-1时, 跳出循环
;如果(di)不等于-1,那么cx-1,继续循环。直到(di) = -1, 或cx = 0

mov ax, 65535
sub ax, cx ;现在cx的值是65535-字符串的长度, 那么65535-(65535-字符串的长度) = 字符串的长度
mov cx,ax

mov ax, 4c00h
int 21h
code ends
end start


2.

assume cs:code
code segment
start:
xor byte ptr ds:[0500H], 11110000b ;0500H单元有一个数
;异或有一个特点,就是任何位与1异或,取反,与0异或,不变
;所以高4位置1取反, 低4位置0不变
mov ax, 4c00h
int 21h
code ends
end start


3.

;编写子程序。求内存中一无符号字节型数据序列的最大值和最小值。
;该无符号字节型数据序列的起始地址位于SI中,
;数据个数位于CX中。要求求得的最大值存放于AH中,最小值存放于AL中。主程序调用子程序实现上述功能。
assume cs:code, ds:data
data segment
NUM db 12,45,0,98,12,255,45,12,36,88,54,12,36 ;最大值为255(FF), 最小值为0(0)
COUNT db $-NUM
data ends
code segment
start:
mov ax, data
mov ds,ax
mov cl, COUNT ;数据个数位于CX中
mov si, offset NUM ;该无符号字节型数据序列的起始地址位于SI中
mov al, [si]; ;假设最小值现在在al中
mov ah, al; ;假设最大值现在在al中

inc si
lp: cmp al, [si]
jb done ;如果al小于[di]的话,那么al还是最小值, 不需要改变
mov al, [si] ;否则[di]中就是最小值,那么将他赋值给al

done: cmp ah, [si]
ja done1 ;如果ah大于[di], 那么不需要改变, 还是最大值
mov ah,[si] ;否则[di]中就是最大值,那么将他赋值给al
done1: inc si
loop lp

mov ax,4c00h
int 21h
code ends
end start


百度不好排版,楼主凑合看吧


源代码文件中的代码是排好版的


PS:若有不明白的地方,可以追问

温馨提示:答案为网友推荐,仅供参考
相似回答