어셈블리 언어 (왕쌍 판) 학습 장 노트 [BX] 및 루프 명령 (1)

머리말

설명 [BX] 및 메모리 유닛

[BX]는 무엇입니까?
그리고 [0]는 다소 유사하지만 [0]이 0 어드레스 오프셋 메모리 유닛을 나타낸다.

我们要完整地描述一个内存单元,需要两种信息:

 1. 内存单元的地址
 2. 内存单元的长度(类型)

我们用[0]表示一个内存单元时,0表示单元的偏移地址,段地址默认在ds中,
单元的长度(类型)可以由具体指令中的其他操作对象(比如说寄存器)指出,
如前边的AX,AL。
[bx]同样也表示一个内存单元,它的偏移地址在bx中,如下面的指令:
mov ax,[bx]
mov ax,[bl]

루프
영어 "루프는"주기를 나타냅니다

기호의 설명 "()"
설명의 간략화를 위해, 다음의 과정, 우리는 "()"는 레지스터 또는 메모리 유닛의 내용을 나타내는 설명 기호를 사용한다.

例:

 - ax中的内容为0010H,我们可以这样描述:(ax)=0010H;
 - 2000:1000处的内容为0010H,我们可以这样来描述:(21000H)=0010H;
 - 对于mov ax,[2]的功能,我们可以这样来描述:(ax)=((ds)*16+2)
 - 对于push ax的功能,我们可以这样来描述:
	(sp)=(sp)-2;((ss)*16+sp)=(ax)
 - 对于pop ax的功能,我们可以这样来描述:
	(ax)=((ss)*16+(sp))
	(sp)=(sp)+2

종래의 기호 상수 (IDATA)를 나타내는
"[...]"IDATA 상수로 표현되는 일정한 오프셋 어드레스와 메모리에 0을 나타낸다.

例:
mov ax,[idata]就代表mov ax,[1]、mov ax,[2]等

5.1 [BX]

명령 기능 :

mov ax,[bx]
功能:bx中存放的数据作为一个偏移地址EA,段地址SA默认在ds中,将SA:EA处的数据送入ax中。

문제 5.1

그림 삽입 설명 여기

inc bx 表示bx=bx+1;
整个程序逻辑还是比较简单的

그림 삽입 설명 여기


5.2 루프 지시

格式:loop 标号
CPU执行loop指令的时候,要进行两步操作:
 - (cx)=(cx)-1;
 - 判断cx中的值,不为零则转至标号处执行程序,如果为零则向下执行。

CX는 명령 루프의 실행 결과의 값에 영향을 미친다.
보통 우리는 루프 명령 및 순환 기능, CX 저장주기를 사용합니다.

任务:编程计算2^12
程序代码:
assume cs:code
code segment
	mov ax,2
	mov cx,11
	s:add ax,ax
	loop s
	mov ax,4c00h
	int 21h
code ends
end
程序分析:
(1)标号
在汇编语言中,标号代表一个地址,此程序中有一个标号s。它实际上标识了一个地址,这个地址处有一条指令:add ax,ax
(2)loop s
CPU执行loop s的时候,要进行两步操作:

 - (cx)=(cx)-1;
 - 判断cx中的值,不为0则转折标号s所标识的地址处执行(这里的指令是"add ax,ax"),如果为0则执行下一条指令(这里的下一条指令是"mov ax,4c00h")
(3)以下三条指令
mov cx,11
s:add ax,ax
loop s
执行loop s时,首先要将(cx)减一,然后若(cx)不为0,刚向前转至s处执行add ax,ax。
所以,我们可以利用cx来控制add ax,ax的执行次数。

사용 CX 및 루프 실현 요약 루프

  • CX는 사이클의 수에 저장
  • 루프 명령 어드레스는 이전에 참조 번호에 의해 식별 될
  • 부호 중간 루프 명령을 쓸 루프 블록을 수행하려면
程序框架:
mov cx,循环次数
s:
循环执行的程序段
loop s

참고 :

自己编写了一个程序调试了一下:
assume cs:codesg
codesg segment
	
		mov ax,2
		mov cx,11
	s:	add ax,ax
		mov cx,7
		loop s
		mov ax,4c00h
		int 21h
codesg ends
end
如果在循环体内改变cx的值,会直接影响到判断条件中的cx,如果循环体中mov cx>1,
则程序会陷入死循环。
也就是说,loop循环是跳到标号处,从标号处继续往下执行,并不是仅仅执行标号处一行语句!!!

문제 5.3

编程,计算123*236,结果放在ax中
程序:
assume cs:codesg
codesg segment
	
		mov ax,0
		mov cx,236
	s:	add ax,123
		loop s
		mov ax,4c00h
		int 21h
codesg ends
end

Tips:mov ax,236 ;mov cx,123;会提高计算效率

지시 디버그에서 프로그램 루프로 구현 5.3 추적 루프

0006 번호 3을 곱하여 단위 저장 DX의 결과 다음과 같은 질문을 고려 FFFF 계산된다. 우리는 분석 :
작업의 (1) 결과는 DX의 범위를 저장할 수있는 초과 여부?

ffff:0006单元中的数是一个字节型的数据,范围在0~255之间,
则用它和3相乘结果不会大于65535,可以在dx中存放下。

(2) 우리는 곱셈, 어떤 레지스터와 축적을 축적 사이클을 달성하기 위해 사용할 수 있습니까?

我们将ffff:0006单元中的数赋给ax,用dx进行累加。先设(dx)=0,然后做3次
(dx)=(dx)+(ax)。

(3) FFFF : 0006 유닛은 바이트 단위이며, AX는 16 비트 레지스터 데이터 길이가 동일하지이다 어떻게 할당 하는가?

注意,“赋值”是让ax中数据的值和ffff:0006单元中的数据的值相等。
8位数据01h和16位数据0001h的数据长度不一样,但它们的值是相等的。
赋值过程:
令(ah)=0,(al)=(fff6h)

프로그래밍 :

assume cs:codesg
codesg segment
		mov ax,0ffffh ;汇编源程序中,数据不能以字母开头
		mov ds,ax
		mov bx,6
		mov al,[bx] ;以上,设置(ah)=0,(al)=((ds)*16+bx)
		mov ah,0
		mov dx,0 ;累加寄存器清零
		
		mov cx,3 ;循环3次
	s:	add dx,ax
		loop s
		
		mov ax,4c00h
		int 21h
codesg ends
end

이상의 프로그램 사이클에 대한 디버그 추적을 디버그.
G는 명령 및 명령 P 수

-g 0014 表示直接跳到ip=0014h处,假设loop s的ip是0012h,则此时循环已经执行完毕。
-p 后台执行完循环,下一步命令是 loop s时使用-p即可运行完循环。

그림 삽입 설명 여기
그림 삽입 설명 여기

게시 된 107 개 원래 기사 · 원의 찬양 (68) · 전망 7770

추천

출처blog.csdn.net/weixin_43092232/article/details/105044820