如何在 Turbo Pascal 中使用程序集 8086 定义字符串?
How to define a string using assembly 8086 in Turbo Pascal?
我只会写汇编代码
我想使用中断 10h/13h 向屏幕写入字符串。但是我不知道如何在 turbo pascal 中使用汇编定义或在内存中保存字符串。
这没有用:
msg1 'hello, world!$'
我的代码:
program string;
begin
asm
mov ah,[=11=]
mov al,03h
int 10h;
mov ax,1300h
mov bh,[=11=]
mov bl,07h
mov cx,
mov dl,[=11=]
mov dh,[=11=]
int 10h
mov ah,00h
int 16h
end;
end.
有人知道吗?
作为终止字符的后缀“$”仅适用于某些 DOS 功能。 INT 10h / AH=13h
(Video-BIOS function) deals with the length of the string in CX
. A "Pascal-string" has its length in the first byte. It has no termination character like a DOS-/C-/ASCIIZ-string. You can get TP manuals - especially the programmer's guide - from here.
看这个例子:
program string_out;
var s1 : string;
procedure write_local_string;
var s3 : string;
begin
s3 := 'Hello world from stack segment.';
asm
push bp { `BP` is in need of the procedure return }
mov ax, ss
mov es, ax
lea bp, s3 { Determine the offset of the string at runtime }
mov ax, 1300h
mov bx, 0007h
xor cx, cx { Clear at least `CX` }
mov cl, [es:bp] { Length of string is in 1st byte of string }
inc bp { The string begins a byte later }
mov dx, 0200h { Write at third row , first column}
int 10h
pop bp
end;
end;
begin
s1 := 'Hello world from data segment.';
asm
mov ah, 0
mov al, 03h
int 10h;
mov ax, ds
mov es, ax
mov bp, offset s1
mov ax, 1300h
mov bx, 0007h
xor cx, cx { Clear at least `CH` }
mov cl, [es:bp] { Length of string is in 1st byte of string }
inc bp { The string begins a byte later }
mov dx, 0000h { Write at first row , first column}
int 10h
mov ax, cs
mov es, ax
mov bp, offset @s2
mov ax, 1300h
mov bx, 0007h
mov cx, 30 { Length of string }
mov dx, 0100h { Write at second row , first column}
int 10h
jmp @skip_data
@s2: db 'Hello world from code segment.'
@skip_data:
end;
write_local_string;
writeln; writeln; { Adjust cursor }
end.
我只会写汇编代码
我想使用中断 10h/13h 向屏幕写入字符串。但是我不知道如何在 turbo pascal 中使用汇编定义或在内存中保存字符串。
这没有用:
msg1 'hello, world!$'
我的代码:
program string;
begin
asm
mov ah,[=11=]
mov al,03h
int 10h;
mov ax,1300h
mov bh,[=11=]
mov bl,07h
mov cx,
mov dl,[=11=]
mov dh,[=11=]
int 10h
mov ah,00h
int 16h
end;
end.
有人知道吗?
作为终止字符的后缀“$”仅适用于某些 DOS 功能。 INT 10h / AH=13h
(Video-BIOS function) deals with the length of the string in CX
. A "Pascal-string" has its length in the first byte. It has no termination character like a DOS-/C-/ASCIIZ-string. You can get TP manuals - especially the programmer's guide - from here.
看这个例子:
program string_out;
var s1 : string;
procedure write_local_string;
var s3 : string;
begin
s3 := 'Hello world from stack segment.';
asm
push bp { `BP` is in need of the procedure return }
mov ax, ss
mov es, ax
lea bp, s3 { Determine the offset of the string at runtime }
mov ax, 1300h
mov bx, 0007h
xor cx, cx { Clear at least `CX` }
mov cl, [es:bp] { Length of string is in 1st byte of string }
inc bp { The string begins a byte later }
mov dx, 0200h { Write at third row , first column}
int 10h
pop bp
end;
end;
begin
s1 := 'Hello world from data segment.';
asm
mov ah, 0
mov al, 03h
int 10h;
mov ax, ds
mov es, ax
mov bp, offset s1
mov ax, 1300h
mov bx, 0007h
xor cx, cx { Clear at least `CH` }
mov cl, [es:bp] { Length of string is in 1st byte of string }
inc bp { The string begins a byte later }
mov dx, 0000h { Write at first row , first column}
int 10h
mov ax, cs
mov es, ax
mov bp, offset @s2
mov ax, 1300h
mov bx, 0007h
mov cx, 30 { Length of string }
mov dx, 0100h { Write at second row , first column}
int 10h
jmp @skip_data
@s2: db 'Hello world from code segment.'
@skip_data:
end;
write_local_string;
writeln; writeln; { Adjust cursor }
end.