Assembly 如何换行并在换行中打印相同字符

Assembly 如何换行并在换行中打印相同字符,assembly,emu8086,Assembly,Emu8086,我在学组装。我在用背景色(黄色)打印“Hello World!(红色文本)”时看到了这个示例 我设法编辑代码,通过反复试验,只打印黄色背景的空格。但是我不能打印新的行。如果我添加一个新的mov[200],''例如(不知道这是否正确),它会在不同的行上添加一个字符,但颜色不同。。如果我在逗号后添加00010001b,则if打印的颜色应为蓝色 有人能给我一个关于这段代码的入门教程吗。我现在只想再打印一行。。这是到目前为止的工作代码。。它打印出一整行黄色 name "hi-world" ; hex

我在学组装。我在用背景色(黄色)打印“Hello World!(红色文本)”时看到了这个示例

我设法编辑代码,通过反复试验,只打印黄色背景的空格。但是我不能打印新的行。如果我添加一个新的
mov[200],''
例如(不知道这是否正确),它会在不同的行上添加一个字符,但颜色不同。。如果我在逗号后添加
00010001b
,则if打印的颜色应为蓝色

有人能给我一个关于这段代码的入门教程吗。我现在只想再打印一行。。这是到目前为止的工作代码。。它打印出一整行黄色

name "hi-world"


; hex    bin        color ;  ; 0      0000      black ; 1      0001    blue ; 2      0010      green ; 3      0011      cyan ; 4      0100    red ; 5      0101      magenta ; 6      0110      brown ; 7      0111  light gray ; 8      1000      dark gray ; 9      1001      light blue ; a      1010      light green ; b      1011      light cyan ; c      1100      light red ; d      1101      light magenta ; e      1110     yellow ; f      1111      white



org 100h

; set video mode     mov ax, 3     ; text mode 80x25, 16 colors, 8 pages (ah=0, al=3) int 10h       ; do it!

; cancel blinking and enable all 16 colors: mov ax, 1003h mov bx, 0 int 10h


; set segment register: mov     ax, 0b800h mov     ds, ax

; print "hello world" ; first byte is ascii code, second byte is color code.

mov [02h], ' '

mov [04h], ' '

mov [06h], ' '

mov [08h], ' '

mov [0ah], ' '

mov [0ch], ' '

mov [0eh], ' '   

mov [10h], ' '

mov [12h], ' '

mov [14h], ' '

mov [16h], ' '

mov [18h], ' '

mov [1ah], ' '

mov [1ch], ' '

mov [1eh], ' '   

mov [20h], ' '


; color all characters: mov cx, 34  ; number of characters. mov di, 03h ; start from byte after 'h'

c:  mov [di], 11101100b   ; light red(1100) on yellow(1110)
    add di, 2 ; skip over next ascii code in vga memory.
    loop c

; wait for any key press: mov ah, 0 int 16h

ret

B800处直接写入视频存储器时:


顺便说一句,您一次写入的字节越多,代码在实际(原始)硬件上运行的速度就越快,因此在您的情况下,我强烈希望使用单词write将ASCII+属性对存储在一起,或者甚至使用DWORD write(32b模式)将两个字母+两个属性存储在一条指令中

您的代码首先在设置ASCII字母的偶数地址上每秒写入一个字节,然后使用颜色值写入每个奇数字节。我个人会这样做:

mov ax,0B800h
mov es,ax
mov di,<target_address = y*160 + x*2>  ; es:di set up
mov ah,<color_attribute_for_whole_string>
; now the print by letter gets here
mov al,'H'  ; al = letter, ah = attribute (ax set up)
stosw       ; [es:di] = ax, di += 2
mov al,'e'  ; change only letter in ax
stosw
mov al,'l'
stosw
mov al,'l'
stosw
...

; the mov al,<char> can be replaced by LODSB
; reading ascii string from ds:si.
; then it would look like:
mov   si,<address_of_ascii_string>
lodsb
stosw
lodsb
stosw
... so many times as the string length
mov-ax,0B800h
斧头
莫夫迪;es:di设置
莫夫啊,,
; 现在,通过信件打印到这里
mov al,'H';al=字母,ah=属性(ax设置)
stosw;[es:di]=ax,di+=2
mov al,'e';仅更改ax中的字母
斯托瓦
mov al,'l'
斯托瓦
mov al,'l'
斯托瓦
...
; mov al可由LODSB代替
; 从ds:si读取ascii字符串。
; 然后它看起来像:
莫夫·西,
洛兹
斯托瓦
洛兹
斯托瓦
... 是字符串长度的几倍

当您在
B800直接写入视频存储器时:


顺便说一句,您一次写入的字节越多,代码在实际(原始)硬件上运行的速度就越快,因此在您的情况下,我强烈希望使用单词write将ASCII+属性对存储在一起,或者甚至使用DWORD write(32b模式)将两个字母+两个属性存储在一条指令中

您的代码首先在设置ASCII字母的偶数地址上每秒写入一个字节,然后使用颜色值写入每个奇数字节。我个人会这样做:

mov ax,0B800h
mov es,ax
mov di,<target_address = y*160 + x*2>  ; es:di set up
mov ah,<color_attribute_for_whole_string>
; now the print by letter gets here
mov al,'H'  ; al = letter, ah = attribute (ax set up)
stosw       ; [es:di] = ax, di += 2
mov al,'e'  ; change only letter in ax
stosw
mov al,'l'
stosw
mov al,'l'
stosw
...

; the mov al,<char> can be replaced by LODSB
; reading ascii string from ds:si.
; then it would look like:
mov   si,<address_of_ascii_string>
lodsb
stosw
lodsb
stosw
... so many times as the string length
mov-ax,0B800h
斧头
莫夫迪;es:di设置
莫夫啊,,
; 现在,通过信件打印到这里
mov al,'H';al=字母,ah=属性(ax设置)
stosw;[es:di]=ax,di+=2
mov al,'e';仅更改ax中的字母
斯托瓦
mov al,'l'
斯托瓦
mov al,'l'
斯托瓦
...
; mov al可由LODSB代替
; 从ds:si读取ascii字符串。
; 然后它看起来像:
莫夫·西,
洛兹
斯托瓦
洛兹
斯托瓦
... 是字符串长度的几倍

“…您必须在地址(y*160+x)处写入…”您在文本视频ram中计算地址的公式是错误的!x坐标需要加倍。(y*160+x*2)@Fifoernik谢谢你,很棒的地点,希望现在能修好。:)谢谢你,我使用了你的建议,效果很好:)如果我遇到其他人,我会再次发布Errors@Ped7g我在第26行之后打印时遇到问题。。我做得对吗。。“…您必须在地址(y*160+x)处写入…”您在文本视频ram中计算地址的公式是错误的!x坐标需要加倍。(y*160+x*2)@Fifoernik谢谢你,很棒的地点,希望现在能修好。:)谢谢你,我使用了你的建议,效果很好:)如果我遇到其他人,我会再次发布Errors@Ped7g我在第26行之后打印时遇到问题。。我做得对吗。。
mov ax,0B800h
mov es,ax
mov di,<target_address = y*160 + x*2>  ; es:di set up
mov ah,<color_attribute_for_whole_string>
; now the print by letter gets here
mov al,'H'  ; al = letter, ah = attribute (ax set up)
stosw       ; [es:di] = ax, di += 2
mov al,'e'  ; change only letter in ax
stosw
mov al,'l'
stosw
mov al,'l'
stosw
...

; the mov al,<char> can be replaced by LODSB
; reading ascii string from ds:si.
; then it would look like:
mov   si,<address_of_ascii_string>
lodsb
stosw
lodsb
stosw
... so many times as the string length