博主是个大笨比,只会阿巴阿巴阿巴
题目:
编写汇编源程序,求出首地址为BUF的10个有符号字的内容之和,并存入字变量SUM单元
分析:
1.首地址为BUF
2.10个有符号字的和
3.存入自变量sum单元
命令 | 指令 |
---|---|
lea | 将源操作数的有效地址传入寄存器 |
offset | 返回变量或标号在段内的地址偏移量 |
xlat | bx 存表的首地址,al存内存偏移量,执行xlat后,以寄存器ds的内容为段基址,以bx+al 为偏移地址,在表中取一个字节送入al 中 |
思路:找到地址,循环求和
方法一:
Data segment
buf dw 1,2,3,4,5,6,7,8,9,0
sum dw ?
Data ends
Stack segment
Stack ends
Code segment
assume cs:Code,ds:Data,ss:Stack
Start:
mov ax,data
mov ds,ax
;================================================================================
;与下面的lea等价的写法
;MOV bx,offset buf
lea bx,buf;取出buf的有效偏移地址
mov cx,10 ;赋值cx为10(循环次数为10)
mov ax,0 ;清空ax寄存器
loop_to_add:
add ax,[bx] ;寄存器间接寻址,找到buf的首地址
add bx,2 ;bx + 2 向后寻找下一个数字
loop loop_to_add
mov sum,ax
;================================================================================
MOV ah,4ch
INT 21h
Code ends
end Start
方法二:(使用xlat指令)
Data segment
buf dw 1,2,3,4,5,6,7,8,9,0
sum dw ?
Data ends
Stack segment
Stack ends
Code segment
assume cs:Code,ds:Data,ss:Stack
Start:
mov ax,data
mov ds,ax
;================================================================================
;与下面的lea等价的写法
;MOV bx,offset buf
lea bx,buf;取出buf的有效偏移地址
mov cx,10 ;赋值cx为10(循环次数为10)
mov al,0 ;清空ax寄存器的低8位
mov dx,0 ;清空dx寄存器
loop_to_add:
xlat
add dl,al ;通过查表指令xlat可知取出的内容存在al中
add bx,2 ;bx + 2 向后寻找下一个数字
mov al,0 ;让bx偏移就够了
loop loop_to_add
mov sum,dx
;================================================================================
MOV ah,4ch
INT 21h
Code ends
end Start
如有错误,请指正,万分感激