어셈블러가 ASCII를 알고 있으므로 아스키를 사용하는 것이 어떻게 힘들지는 모르겠지만 모든 노력이 필요합니다.
그렇지 않으면 "Hello world!"를 정의해야합니다. 같은 : 나는 뇌에 각인 한 것처럼 대신에 당신이 기억 할 필요가 없습니다 당신은 sub al,'0'
같은 일을 실제로 할 수있는 편리한
hello_str db 'Hello world!$'
의
hello_str db 72, 101, 108, 108, 111, 32
db 119, 111, 114, 108, 100, 33, 36
'0'
는 값 48
입니다 당시에는 어셈블러가 없었기 때문에 종이로 만든 코드를 직접 기계 코드 바이트에 집어 넣은 다음 그 손으로 계산 된 값으로 메모리를 설정 한 짧은 BASIC 프로그램을 작성해야했습니다. 그리고 만약 내가 명령 인코딩을 엉망으로 만들면 완전히 다른 무언가가 실행되고 대개 기계 전체가 충돌하게됩니다. ASCII가 있다고 생각한다면 PITA는 무엇인지 모르실 것입니다. : D BTW
, 그 코드에서 심지어 높은 수준의 논리는 당신이 바란 같은 벡터 값의 측면에서, 당신은 잘못된 결과를 얻을 것이다 것은 예를 들어, 일을 할 경우에도 잘못된 :
벡터 : 2,8,3,5,4,4가 최대 값을보고합니다.
벡터를 별도의 데이터 세그먼트에 넣고 같은 값 (예 : 65536 x "5")으로 채우려면, , 당신은 무한 루프로 끝날 것입니다.
쓰기 먼저이 같은 의견에 알고리즘 :
다음
; load vector size
; if size is zero, end with "no data" result
; (jump separate branch of code with own exit)
; set temporary_max to first element of vector
; load index to point to second element of vector
; while (index within bounds of vector) do {
; compare vector element at index with temporary_max
; if element is greater, then temporary_max = element
; increment index and loop }
; print temporary_max as result
; exit to DOS
할 수 있도록, 그와 "길이"대 "인덱스" "요소를 비교"와 같은 일부 지침의 핵심 부분을 채우기 위해 시도 데이터가 메모리에 어떻게 저장되는지, 구조는 무엇인지, 비트 크기는 무엇인지, 인코딩은 무엇이며, 어떤 명령을 사용하여 조작 할 수 있는지 생각하십시오.
코어 부품이 추측되는 경우, CPU에만 완전히 들어갈 수 있거나 필요한 경우 몇 가지 로컬 변수 또는 스택 메모리가 필요한 경우 고정 레지스터를 할당하기 위해 필요한 레지스터 수를 확인하십시오 ("find max"루프는 벡터 요소를 읽을 때만 메모리에 접근 할 수 있고 나머지는 레지스터에 모두 맞을 수 있습니다.) 주석에 이러한 할당을 쓰고 레지스터 충돌이있는 곳에서 노트를 만들고 추가 수단 (푸시/팝 또는 로컬 변수)을 사용하여 값을 보존해야합니다.
그런 다음 실제 지침으로 각 주석 부분을 채우십시오. 이번에는 완전히 해결하십시오.약간의 작은 부분부터 자유롭게 시작하여 디버거에서 단계별로 예상대로 작동하는지 확인하십시오 (예 : 일부만 가짜 인 mov register,test_value
을 넣어 해당 부분에서 예상되는 상태를 시뮬레이트하므로 디버거에서 확인할 수 있음). 예상).
모든 부품을 채우고 디버깅 한 후에는 프로그램이 작동해야합니다. 끝난. 당신 FFS는 소스에 "e1:
"같은 것을 쓸 수있는 방법
그리고 마지막 것은 ... 나 심지어 내가 너무 많은 경험과 당신과 함께 지식을 공유하기 위해 귀찮게 않았다 후회하게
...
.
서둘러 키보드를 10 번 더 밟으시겠습니까? 그런데 왜 갑자기 여기에 전체 질문을 게시 할 시간이 있습니까?
프로그래밍에 대해 알아야 할 첫 번째 사항 중 하나는 쓰기보다는 여러 번 소스를 읽는 것입니다.
글을 쓰는 동안 단축키를 사용하는 것이 어렵습니다. 읽기가 어려워지면 시간이 절약됩니다. 소스를 다시 작성하는 명확한 방법이있는 경우에는 언제든지 그렇게하십시오. 몇 분이 더 소요될 수 있지만, 결과가 더 깔끔하게/더 짧게/더 쉽게 소스를 읽을 수 있으면, 나중에 읽거나 (여러 번, 디버깅 중 등) 갚을 수 있습니다. 당신이 e1:
충분 생각한다면
, 그때는 단순히 당신이 je $+4
을 쓸 수 대신 je e3
처럼 직접 코드로 오프셋 (offset)를 작성하고 지금은 필요하지 않은, 전혀 레이블을 사용하지 않는, 당신을위한 제안이 심지어 귀하의 출처에 e3:
을 작성하십시오. 승리.
그들이 당신에게 말하고 싶은 것은 당신이 숫자가 아니라 문자열을 가지고 있다는 것입니다. 숫자로 선언하거나 변환하십시오. – Jester
어셈블러를 사용하여 목록을 작성한 다음 벡터가 메모리 (바이트 값)에 정의 된 방법을 연구하십시오. 아니면 디버거에로드하고 레지스터 + 메모리를 살펴보십시오. 그러면 "5"가 0x35 인 이유에 대해 질문 할 것이므로 ASCII 인코딩에 대해 읽어야합니다. 그런 다음 벡터 정의를 변경하면 '어떻게 번호를 인쇄 할 수 있습니까?'와 같은 모양이됩니다. http://stackoverflow.com/tags/x86/info의 푯말을 보면 http : // stackoverflow를 확인할 수 있습니다. com/a/40505938/4271923 (아마도 영감을 얻기 위해 전체 질문을 확인하십시오.) – Ped7g
BTW, 이것이 숙제 일 경우, 몇 가지 코스/수업이있었습니다. 당신이 짧은 사실 요약을 쓸 시간이 있다면 정말 고맙겠습니다. 저는 항상 어떤 것들이 가르쳐지고있는 법을 배우고 싶습니다. 제 생각에 올바른 방법이라고 생각합니다.) – Ped7g