汇编——循环
1、有关独立变量的
eg : z=((x+y)*8-x)/2
编程思想:
x+y: 用add就可以实现
-x: 用sub实现
*8: 可以使用左移指令shl移动3次,就是乘以8(因为移位的次数超过一,所 以可以先将移位的次数3送进cl寄存器中)
/2: 右移指令shr
data segment
x dw 8
y dw 8
result dw ?
data ends
stack segment
dw 10 dup(0)
stack ends
code segment
assume cs:code,ss:stack,ds:data
start:mov ax,data
mov ds,ax
mov ax,x
add ax,y
mov cl,3
shl ax,cl
sub ax,x
shr ax,1
mov result,ax
mov ah,4ch
int 21h
code ends
end start
我们可以手算结果为60,转换为十六进制就是003C,在DOXBOX中运行后可看到AX里的数正确。
2、循环
XHBC1:有一个字数组a,编程将其复制到b数据区
编程思想:就没啥说的哈,就是用loop咯
data segment
a dw 0,1,2,3,4,5,6,7,8,9
b dw 10 dup(0)
data ends
stack segment para stack
dw 10 dup(0)
stack ends
code segment
assume cs:code,ds:data,ss:stack
start: mov ax,data
mov ds,ax
mov si,0
mov di,0
try: mov cx,b-a
mov ax,a[si]
mov b[di],ax
inc si
inc di
loop try // 一条LOOP指令相当于dec cx jnz <标号> 两条指令的组合
mov ah,4ch
int 21h
code ends
end start
截图就不截了吧,自己运行。
分析:
运行完所有程序后,从数据段的起始地址13FC:0000查看该段内存为
00 00 01 00 02 00 03 00 04 00 05 00 06 00 07 00 08 00 09 00 00 00 01 00 02 00 03 00 04 00 05 00 06 00 07 00 08 00 09 00
可见b数组对应的内存被复制了a数组的信息,实验结果正确。
XHBC2: 有a、b是2个字节数据区,其长度都相同,编程将a、b数据区对应元素作为字的高、低两字节存入字数据区c中对应位置。
data segment
a db 3,2,5,7,4
b db 2,7,1,3,6
c dw 10 dup(0)
data ends
stack segment para stack
dw 10 dup(0)
stack ends
code segment
assume cs:code,ds:data,ss:stack
start:mov ax,data
mov ds,ax
mov si,0
mov di,0
mov cx,5
try: mov ah,a[si] // 变址寻址方式,将a数据区对应元素作为字的高字节存在ah中
mov al,b[si] //变址寻址方式,将b数据区对应元素作为字的低字节存在al中
mov c[di],ax
inc si
inc di
inc di
loop try
mov ah,4ch
int 21h
code ends
end start
分析:
运行完所有程序后,从数据段的起始地址076A:0000查看该段内存为
03 02 05 07 04 02 07 01 03 06 02 03 07 02 01 05 03 07 06 04
可见a,b数据区对应元素已作为字的高、低两字节存入字数据区c中对应位置,画横线的数据为c数据区的对应元素,达到题目要求。
***XHBC3:***编程求字数据区a中所有正数之和,结果存于字x中。
data segment
a dw 5,-5,2
count equ $-a
x dw ?
data ends
stack segment
dw 10 dup(0)
stack ends
code segment
assume cs:code,ds:data,ss:stack
start: mov ax,data
mov ds,ax
mov ax,0
mov bx,0
mov si,0
mov cx,count
sar cx,1 // count是字节变量,但是数据是字变量
try: mov ax,a[si]
cmp ax,0
jg a1
inc si
inc si
loop try
a1: add bx,ax
inc si
inc si
loop try
mov x,bx
mov ah,4ch
int 21h
code ends
end start
分析:运行完所有程序后,从数据段的起始地址076A:0000查看该段内存为
05 00 FB FF 02 00 07 00
可见5,-5,2存入内存中,程序运行后,正数之和是7,结果正确。
这三道循环题其实是俺们老师之前的作业,哈哈哈,以后遇到了再补吧,✌