http://chortle.ccsu.edu/AssemblyTutorial/Chapter-20/ass20_1.html
이 장에서는 반복과 분기구조를 보여주는 두개의 예제 프로그램을 공부한다. 또한 어셈블리어에서 문자열과 정수의 배열을 어떻게 표현하는 가를 공부한다.
주제:
Null로 끝나는 문자 strings.
string의 길이를 구하는 프로그램.
정수 배열.
Array를합산하는 프로그램.
질문: 문자열 또는 string은 ascii 패턴을 담고 있는 바이트의 열이다. null로 끝나는 string의 끝에는 무었이 옵니까?
http://chortle.ccsu.edu/AssemblyTutorial/Chapter-20/ass20_2.html
답: 0 byte (또는 null byte)
null로 끝나는 string 이란 하나의 문자가 하나의 바이트에 해당하는 ascII 문자열이고 0 byte(null)로 끝난다. null로 끝나는 string은 C와 C++ 언어에서 일반적으로 사용된다. 다음은 어셈블리에서 string이 어떻게 선언되는가를 보여준다.
문자들은 메모리에 'T'부터 시작하여 순서대로 배열된다. 다음 그림은 문자가 배열되는 것을 보여준다. 공백을 나타내는 바이트는 ASCII의 space 코드(0x20)으로 채워진다. 마지막 바이트는 그림에서는 사선(slash)으로 표현된 0x00로 채워진다.
attachment:nullTermString.gif
다음과 같은 것을 PC 윈도우에서 작동하는 SPIM의 데이터 표시창에서 볼 수 있다. 문자들은 주소 0x10000000에 있는 문자 'T'부터 시작하여 순서대로 메모리에 배치된다. 실제 표시창에서 이것을 보기가 쉽지는 않을 것이다.
표시창은 32 비트 little-endian의 정수를 나타내는 것이 목적이다. 4바이트씩 묶어서 오른쪽에서 왼쪽으로 표시된다.
attachment:spimString.gif
http://chortle.ccsu.edu/AssemblyTutorial/Chapter-20/ass20_3.html
답:
'i'
attachment:strlen.gif
널로 끝나는 string의 길이는 null을 뺀 나머리 문자의 갯수이다. string의 길이를 계산하기 위해서 0부터 string 길이의 값을 세기 시작한다. string의 연속되는 byte에서 null이 아닌 byte 값마다. string 길이의 값을 증가시킨다. null 값을 발견하면 길이 계산을 중단한다.
그림의 순서도는 이러한 절차를 보여주고 있다. 순서도는 일반적인 차원에서 알고리즘을 보여주고 있다. 어셉블리의 세부사항은 코딩단계에서 한다. 다음은 프로그램의 대략적인 뼈대이다.
http://chortle.ccsu.edu/AssemblyTutorial/Chapter-20/ass20_4.html
답:
일반적으로
length( string1 ) + length( string2 ) = length( concat( string1, string2) )
입니다. 만약 문자열의 끝의 null값이 길이에 포함 된다면, 결과 문자열은 null값이 끝에 하나만 있는 것에 반해 원래의 두 문자열은 null을 두개 포함하기 때문에 이 식은 참이 되지 않습니다.
차트의 두번째 박스에 따르면 먼저 첫번째 문자를 가리켜야 한다. 첫번째 문자를 가리키는 방법은 여러 가지가 있다. 나중에 어런 일을 하는 쉬운 방법을 배울 것이다. 그러나, 일단은, 데이터 섹션이 0x10000000에서 시작한다는 것을 기억하자. lui명령으로 베이스 레지스터의 상위 halfword 0x1000을 올린다.
http://chortle.ccsu.edu/AssemblyTutorial/Chapter-20/ass20_5.html
답: 아래를 참조하세요.
lbu명령에 있는 바이트의 주소는 $9 에 차를 더한 값과 같다. 베이스 주소인 $9가 이미 문자를 가리키고 있기 때문에 차는 0가 될 것이다.lbu는 $10의 하위 바이트로 문자를 로드한다. 상위 3바이트는 0이 된다. beq명령이 레지스터 전체가 0인지를 검사한다 (물론 하위 바이트도 0인지 점검한다).
http://chortle.ccsu.edu/AssemblyTutorial/Chapter-20/ass20_6.html
답: 아래를 참조
베이스 레지스터는 string의 각바이트 마다 1바이트씩 주소를 증가시켜 이동한다. 이것을 pointer를 이동시킨다라고 할 수 있다.이 프로그램은 각각의 행마다 중요한 개념을 가지고 있다. 이러한 개념을 사용하는 것이 바로 프로그램하는 방법이다.
이 프로그램은 c 표준 라이브러리의 function int strlen(char*)와 아주 유사하다. 위에 쓰여진 프로그램은 자체의 데이터를 가지고 있고 function을 호출할 수 있도록 쓰여진 것은 아니다. 나중 장에서 페라미터와 함께 호출할 수 있는 function을 작성 해 볼것이다.
질문: string이 null 바이트로만 작성된 길이가 0인 null string이라도 이 프로그램이 올바르게 작동하겠습니까?
http://chortle.ccsu.edu/AssemblyTutorial/Chapter-20/ass20_7.html
답:
예.
정수의 배열은 메모리에 연속되는 word로된 정수들의 연속이다. 배열에서 정수의 숫자는 메모리에도 그 값이 또한 저장 된다.
attachment:integerArray.gif
어셈블리어에서 정수의 배열은 지정자(directive) .word로 지정하고 정수를 쉼표(,)로 구분한 리스트를 사용한다.
http://chortle.ccsu.edu/AssemblyTutorial/Chapter-20/ass20_8.html
답: null word는0x00000000이고 일반적으로 흔히 쓰이는 정당한 정수값이다.
때때로 프로그래머는 0x00000000같은 비트 형태가 데이터에 전혀 나오지 않을 것이라고 확신하면서 배열의 끝을 나타내는데 사용하고자 한다. 이러한 것에 버그가 발생하기 쉽다. 그러한 비트 패턴이 정확한 데이터에는 나타나지 않을 지라도 잘못된 데이터에서는 흔하게 찾아볼 수 있다. 여러분이 작성하는 프로그램은 잘못된 데이터라도 적절히 다룰 수 있어야 한다.
다음의 예제 프로그램은 정수의 배열을 사용한다. 배열의 길이는 미리 정해져 있다. 여러분이 작성하는 프로그램은 세가지 합을 계산한다:
모든 정수의 합.
양수의 합.
음수의 합.
아마도 C나 자바로 작성한 예제 프로그램을 전에 보았을 것이다.
질문: 프로그램의 순서도를 그려보거나 의사코드를 작성해 보자.
http://chortle.ccsu.edu/AssemblyTutorial/Chapter-20/ass20_9.html
답: 다음을 보자
attachment:addIntArray.gif
순서도는 어떤 언어에서도 사용할 수 있다. 언어적인 세부사항들은 디자인과정에서는 생략하였다. 위의 차트는 구조를 갖춘 순서도이다. 다음은 프로그램의 대략적인 틀이다.
http://chortle.ccsu.edu/AssemblyTutorial/Chapter-20/ass20_10.html
답:아래를 보자.
attachment:addIntArray.gif
이제 배열의 크기를 알아야 한다. 데이타 영역에서 첫번째 word가 배열의 크기를 선언하고 있다. 데이터 영역은 스핌에서 주소 0x10000000에서부터 시작한다. 그 주소의 상위반을 베이스 레지스터에 오린다. 그런 후에 배열의 크기를 레지스터 $15에 올린다.
그런 후에 베이스 레지스터가 배열의 첫번째 워드를 가리키도록 하자.
http://chortle.ccsu.edu/AssemblyTutorial/Chapter-20/ass20_11.html
답: 다음을 보자
여러분은 베이스 레지스터에 4를더하기 보다는 1을 더했을 수도 있다. 베이스레지스터 $9은 완전한 워드 크기인 4씩 증가 시켜야만 한다. 자이제 루프를 완성해보자. beq명령에서 count 값이 배열의 끝에 도달하면 루프에서 분가하여 나간다.
http://chortle.ccsu.edu/AssemblyTutorial/Chapter-20/ass20_14.html
답: 다음을 보자
이제 참 블록과 거짓 블록을 구현해보자. 참일 경우 음수의 합에 현재 배열의 값을 더하고.거짓인 경우는 양수의 합에 값을 더한다. 자세히 살펴보고 블록을 혼동하지 말자.
http://chortle.ccsu.edu/AssemblyTutorial/Chapter-20/ass20_15.html
답: 다음을 보자
다음은 직접 실행해 볼 수 있는 완성된 프로그램이다. 테스트를 쉽게 하기위해 배열에 있는 데이터는 간단한 것을 사용하였다. 작성된 코드가 어떻게 순서도와 부합하는지 공부해보자.
http://chortle.ccsu.edu/AssemblyTutorial/Chapter-20/ass20_16.html
답: 예,연습삼아 해봅시다.
attachment:continueMenu.gif
PC (to 0x00400000) 를 초기화해서 프로그램을 실행시킬 수 있다. 반복해서 1스텝씩(F10) 실행시켜보자. 배열의 데이터가 많으면 이런 과정은 지루할 수 도 있다. 윈도우 버전의 스핌에서는 다음과 같이 시작해서 프로그램을 실행 할 수 있다.
PC를 초기화 한다.
2. F10키를 한번 누른다. 또는 원한다면 여러번 누린다.
3. Simulator 메뉴의 Continue를 클릿 한다.
4. 프로그램은 프로그램의 끝으로 PC가 넘어갈때까지 수행된다.
5. 스핌 스뮬레이터가 정지된다.
이런 절차가 어색할 수 도 있다. 원한다면 마지막 명령에 브레이크 포인트를 설정할 수 있다. 또는 루프 위쪽에 브레이크를 설정하고 Continue마다 루프가 한번씩 수행되게 할 수 있다.
Go를 메뉴에서 클릭 하면 시뮬레이터는 존재하지 않는 코드를 실행하려다 멈출것이다. Bare Machine이 옵션 메뉴에 설정되어 있기 때문에 추가적인 코드가 없는 것이다. 이런 저런 실험을 하고 싶지않다면 당분간 이런식으로 설정을 한다.
질문: 프로그램을 한번 실행하는 것으로 코드가 정확하다고 확신할 수 있습니까?
Contents
1. 반복구조와 분기구조의 예
2. Null로 끝나는 String
3. String의 길이
4. 프로그램
5. 루프 본체
6. 완성된 프로그램
7. 정수 배열
8. 프로그램 예제: 정수 배열의 합
9. 순서도
10. 배열의 크기를 구해보자
11. 루프 만들기
12. 합계 구하기
13. 음수값을 판단하기
14. 참 또는 거짓으로 분기하기
15. 완성된 프로그램
16. 프로그램 실행하기
17. 20장 끝
1. 반복구조와 분기구조의 예
2. Null로 끝나는 String
3. String의 길이
4. 프로그램
5. 루프 본체
6. 완성된 프로그램
7. 정수 배열
8. 프로그램 예제: 정수 배열의 합
9. 순서도
10. 배열의 크기를 구해보자
11. 루프 만들기
12. 합계 구하기
13. 음수값을 판단하기
14. 참 또는 거짓으로 분기하기
15. 완성된 프로그램
16. 프로그램 실행하기
17. 20장 끝
Recent Posts
Archive Posts
Tags