2017-01-14 1 views
0

8086 어셈블리에서 숙제를하려고합니다. 그러나 나는 그것을 얻는 것처럼 보일 수 없다. 내 코드가 잘못되었다는 것을 알고 올바른 접근 방식과 답변을 찾으려고 노력합니다. 사람들은 처음부터 올바른 경로가 아닌 것처럼 완전히 잘못되었다고 말했습니다.어셈블리 8086의 다음 벡터에서 최대 수를 인쇄하십시오.

벡터에서 최대 수를 찾는 데 문제가 있습니다.

.model small 
.stack 100h 
.data 
    a db '5 ', '21 ', '4 ', '13 ', '2 ', '31 ', '22 ', '$' - the vector 
    max db 0 - max variable 
.code 
    mov ax,@data 
    mov ds,ax 
    mov ah, 09h 
    mov dx, offset a 
    int 21h 
    mov si,0 - setting the increment variable to 0 
    jmp e1 

e1: 
    mov bh,a[si] 
    mov dh,a[si+1] 
    cmp bh,dh - compare the 0 element to the 1 element 
    jl e2 
    inc si 
    jmp e1 

e2: 
    mov max,dh - if bh is less than dh, set max to dh value 
    inc si 
    cmp si, 6 - starting from 0, compare if the increment variable is at the end 
    je e3 
    jmp e1 

e3: 
    mov dx,offset max 
    mov ah,09h 
    int 21h 
    mov ah,4ch 
    int 21h 
end 

사람들은 내가 그것을 재현해야한다고 말했지만, 정확히 어떻게 해야할지 모르겠다. 그들은 어셈블리가 공간을 포함하여 모든 것을 아포스트로피로 사용하기 때문에 코드가 작동하지 않는 이유가 있다고 말했다. 그리고 어떻게 든 엉덩이에 통증이 ASCII 테이블을 사용해야합니다.

+3

그들이 당신에게 말하고 싶은 것은 당신이 숫자가 아니라 문자열을 가지고 있다는 것입니다. 숫자로 선언하거나 변환하십시오. – Jester

+0

어셈블러를 사용하여 목록을 작성한 다음 벡터가 메모리 (바이트 값)에 정의 된 방법을 연구하십시오. 아니면 디버거에로드하고 레지스터 + 메모리를 살펴보십시오. 그러면 "5"가 0x35 인 이유에 대해 질문 할 것이므로 ASCII 인코딩에 대해 읽어야합니다. 그런 다음 벡터 정의를 변경하면 '어떻게 번호를 인쇄 할 수 있습니까?'와 같은 모양이됩니다. http://stackoverflow.com/tags/x86/info의 푯말을 보면 http : // stackoverflow를 확인할 수 있습니다. com/a/40505938/4271923 (아마도 영감을 얻기 위해 전체 질문을 확인하십시오.) – Ped7g

+1

BTW, 이것이 숙제 일 경우, 몇 가지 코스/수업이있었습니다. 당신이 짧은 사실 요약을 쓸 시간이 있다면 정말 고맙겠습니다. 저는 항상 어떤 것들이 가르쳐지고있는 법을 배우고 싶습니다. 제 생각에 올바른 방법이라고 생각합니다.) – Ped7g

답변

2

어셈블러가 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:을 작성하십시오. 승리.

+0

@Topliner : 당신은 일반인임을 이해하는 대신에 일반화하고 많은 것을 생각합니다. Q는 기본적인 노력이 부족하다는 것을 보여주었습니다. "탁자에 쓰는 교사"는 다음과 같습니다. 프로그래머가 소스를 작성하는 것이 아니라, 얼마의 시간을 절약 할 수 있습니다. 다시 말해서 그들은 Assembly에서 어떤 상징이 있고 그것이 얼마나 중요 할 수 있는지를 설명 할 수 없었습니다. 적어도 합당한 의견을 적어주십시오. 어쨌든, 나는 당신이 대답의 형식을 생각하고, 내용에 대해서는 의문의 여지가 없다는 것을 알기 때문에 모든 것이 분명합니다. 다행히 도울 수있어. BTW, 당신은 우주와 어쩌면 힘든 시간을 보내 게 될 것입니다 ... – Ped7g

+0

@Topliner : 물론 멋진 누군가가 당신의 손을 잡고 당신을 따라 줄 때까지 기다릴 수도 있고, 아니면 당신을 위해 숙제를 할 수도 있습니다. 확실히 여기에 아주 좋은 영리한 사람들이 있습니다. 또는 나와 같은 쓴 독성 존재에 의해 해답에서 사실 정보를 추출하는 방법을 배울 수도 있습니다. 자유로운 세상, 선택의 폭이 넓어 하늘 만이 한계입니다. 예를 들어, "우리는 디버거에 관해 가르쳐주지 않았습니다."라는 주장은 모든 것이 당신에게 가르쳐지기를 기대하면서, 당신 자신에게 한계를 부과하는 것입니다. 아니. 너 자신도 밀어 라. – Ped7g

+0

길고 섬세한 도움이되는 대답을 얻었고 Stack Overflow에 엉덩이가 가득 찼다는 주석을 보았습니다. 당신의 벽에 거울이 매달려 있습니까? Ped7g, 첫 번째 코딩 프로젝트 중 하나가 어셈블러를 작성하지 않은 것에 놀랐습니다. :-) –

관련 문제