저수준 프로그래밍에 대한 기술을 새로 고침하기 위해 현재 x86 어셈블러를 사용 중입니다. 테스트 목적으로 주어진 문자열을 출력하는 함수를 작성하려고했습니다. 인쇄 기능 자체가 잘 작동합니다. 추가 단계에서 디스크에서 두 번째 어셈블러 프로그램을로드하여 텍스트를 인쇄하려고했습니다. 주소로 점프 할 때 디스크에서로드하는 것이 좋습니다.인쇄 기능을위한 x86 어셈블러 (nasm)의 데이터 세그먼트 문제
[... loading from disk etc ... program is loaded to 0x7e0:0001]
jmp 0x7e0:0001
[... context of other asm ...]
jmp Start
;data fields
msg db "Hello World!",0
Start:
xor si, si ; clear SI register
mov si, msg ; load message to SI register
call Print
cli
hlt ; halt the system
Print:
.PrintLoop:
lodsb ; load byte from SI register
or al, al ; check if 0 byte
jz short .PrintDone ; if so - stop
mov ah, 0Ah ; function - print text to cursor
int 0x10 ; BIOS interrupt
jmp .PrintLoop ; continue with next char
.PrintDone:
ret
이 프로그램은 모두 잘 작동 : 여기
은 주어진 시나리오입니다. 내가 직면하는 유일한 문제는 텍스트가 인쇄되지 않는다는 것입니다. 디버깅하는 동안 인쇄 기능을 즉시 .PrintDone 레이블을 점프 SI에서 아무런 데이터도 보이지 않으므로 lodsb는 널 바이트 이외에 아무 것도로드하지 않기 때문에 봤습니다.데이터 세그먼트에 문제가있을 수 있다는 사실을 생각하고있었습니다.
xor ax, ax ; clear ax register
mov ax, cs
mov ds, ax ; set data segment pointer
을하지만이 프로그램의 행동에 대해 아무 것도 변경하지 :
따라서, 나는 시작 루틴의 시작 부분에 다음 줄을 추가했다. 아무것도 인쇄되지 않습니다.
EAX=00000a00 EBX=00000000 ECX=00000002 EDX=00000000
ESI=00000026 EDI=00000000 EBP=00000000 ESP=0000ffff
EIP=00000036 EFL=00000046 [---Z-P-] CPL=0 II=0 A20=1 SMM=0 HLT=1
ES =07e0 00007e00 0000ffff 00009300
CS =07e0 00007e00 0000ffff 00009b00
SS =9000 00090000 0000ffff 00009300
DS =07e0 00007e00 0000ffff 00009300
당신이 여기 무엇을 어떤 실마리이야가 있습니까 :
실행이 정지 명령에 도달하면, 다음주는 CPU 레지스터를 검사?
mov ah, 0Ah -> mov ah, 0xE
수정 문제 -
교체 [EDIT 문제가 해결]!
최저 세바스찬
'ds'를 설정 한 상태에서'.PrintDone'으로 곧바로 이동합니까, 아니면 그냥 아무것도 인쇄하지 않습니까? (나는 당신이 방해하기 바로 전에'아 '를 원한다고 생각합니다, 도끼가 아닙니다.) – ughoavgfhw
안녕하세요, 도끼의 고전적인 오타가 다시 아에게 고정되었습니다. 이제이 프로그램은 뭔가 이상한 숯을 인쇄하고 있습니다. 레지스터를 검사 할 때 실행에 도달 시스템이 정지들이 다음과 같은 항목이있을 때 : ES = 07e0 00007e00 0000ffff 00009300 CS는 = 07e0는 00007e00 0000ffff 00009b00 SS = 9000 00090000 0000ffff 00009300 DS = 07e0은 00007e00 0000ffff 00009300 –
나는 생각하지 않습니다 인터럽트는 커서를 움직입니다. 이는 두 개 이상의 문자가 인쇄되면 마지막 문자 만 볼 수 있음을 의미합니다. 또한 'si'가 끝 부분의 올바른 지점을 가리키고 있는지 확인하십시오. 내가 옳은 것으로 계산되면 "데이터 필드"에 24 바이트의 데이터가 있어야합니다. 코드는 괜찮아 보입니다. – ughoavgfhw