我很好奇有多少种方法可以在x86汇编中将寄存器设置为零.使用一条指令.有人告诉我,他设法找到了至少10种方法.
我能想到的是:
xor ax,ax
mov ax, 0
and ax, 0
Run Code Online (Sandbox Code Playgroud) 测试平台是32位Linux.
基本上,我知道gcc可以用来生成Intel和At&T样式的汇编代码,但似乎你不能直接使用nasm/tasm来编译生成的Intel样式汇编代码.
我正在Windows和Linux平台上进行项目分析asm代码,所以我想如果它们都可以由像nasm\yasm这样的平台独立汇编程序编译,我可以有一个更容易的时间......
所以我的问题是如何从Linux上的c源代码生成一个nasm可编译的汇编代码?
ar db "Defference $"
Run Code Online (Sandbox Code Playgroud)
有什么区别
mov dx,offset ar
Run Code Online (Sandbox Code Playgroud)
和
lea dx,ar
Run Code Online (Sandbox Code Playgroud)
我认为两者都在做同样的工作,但这两者之间有什么区别
我这里有这个代码,但我不熟悉语法.
STACK16_SIZE = 100h
stack16 db STACK16_SIZE dup (?)
Run Code Online (Sandbox Code Playgroud)
我认为dup
意味着我们声明一个类型为array的变量,因为这是一个堆栈,但我不确定.那么dup
TASM究竟意味着什么呢?
我的信息来自这里.该作业要求读取不超过20个字符的程序,将这些字符转换为大写,然后将输入打印为大写字母.
我不知道如何从int21/AH = 0ah访问输入.除非我理解上面链接的内容,否则我真的不能问更准确的问题.谁能解释一下?此外,如果这有任何区别,我正在使用TASM.另外,我正在对freedos进行测试.
UPDATE1:
好的,多亏了你的帮助,我相信我理解中断是如何设置和行为的.
设置: 我必须指定一个ds:dx,我希望这个缓冲区存在
我必须将ds:dx设置为20(设置缓冲区可以容纳的最大字符数)
我必须将ds:dx + 1设置为0(我想以某种方式设置要读入的最小字符数)
实际上调用int21/AH = 0ah,它将转到ds:dx并解释预设的字节.它会在等待输入时暂停程序
int21/AH = 0ah将从我的输入填充ds:dx + 2 + n(其中n是输入的字符数,包括'\ r')
我现在的问题是,我该怎么做.我刚刚再次查看了x86汇编语言参考,但还没有找到任何有用的东西.
代码我到目前为止
assume cs:code,ds:code
code segment
start:
mov ax,code ;moves code segment into reg AX
mov ds,ax ;makes ds point to code segment
mov ah,0ah
int 21h
mov ax,1234h ;breakpoint
mov ah,9
mov dx,offset message
int 21h
endNow:
;;;;;;;;;;ends program;;;;;;;;;;
mov ah,0 ;terminate program
int 21h ;program ends
message db 'Hello world!!!',13,10,'$'
code ends
end …
Run Code Online (Sandbox Code Playgroud) 考虑以下宏:
pixelFast MACRO
; This macro draws a pixel, assuming the coordinates are already loaded in cx&dx and the color is in al.
xor bh, bh
mov ah, 0ch
int 10h
ENDM
drawRect MACRO x1, y1, x2, y2, color
LOCAL @@loop, @@row_loop
xor cx, cx
mov dx, y1
mov al, BYTE PTR [color]
@@loop:
mov cx, x1
@@row_loop:
pixelFast
inc cx
cmp cx, x2
jna @@row_loop
inc dx
cmp dx, y2
jna @@loop
ENDM
rendToolBar MACRO
drawRect COLORDISP_X1, COLORDISP_Y1, COLORDISP_X2, …
Run Code Online (Sandbox Code Playgroud) 我是新来的组装和我目前正在读会经常表达的东西就像一个向导ax:bx
,ds:dx
,ss:sp
。
在“精通Turbo汇编”第85页的示例中,我将使用以上示例之一。
注意,ss:sp中的逻辑地址指向堆栈中最后一个字节以下的字节。
:
符号的含义是什么?
亲切的问候。
我的汇编中的简单程序有问题.我正在使用DOSbox和TASM.我有程序问题.操作数类型与第76 78 80行不匹配.这是在乘法之后.我尝试使用difftrent变量大小进行一些更改
; --------------------------------------------
; Equation=(a+c*b)/d-2*c,
; --------------------------------------------
.model small
.stack 100h
.data
a db 0
b db 0
c db 0
d db 0
result1 db ?
result2 db ?
message1 db "Equation: (a+c*b)/d-2*c a=$"
message2 db "b=$"
message3 db "c=$"
message4 db "d=$"
message5 db "Result=$"
.code
start: mov ax,@data
mov ds,ax
mov ax, seg message1 ;get a and save to a variable
mov ds,ax
mov dx,offset message1
mov ah, 9h
int 21h
mov ah, 1h
int …
Run Code Online (Sandbox Code Playgroud) 配置:
MS-DOS 16 BIT(在.asm文件中写入,然后用TASM和TLINK编译它们)
Windows 7 x64
我在Assembly中创建了一个简单的程序,它只应该打开一个文件并为其写一个文本.
这是代码:
assume cs:code, ds:data
data segment
fileName db "input.txt", 0 ; We assure it is an ASCIIZ(ero) file.
toWrite db "Hello World!", "$"
data ends
code segment
writeToFile:
; pentru functia 3Dh
mov AH, 3Dh
mov AL, 0h
mov dx, offset fileName
int 21h
ret
start_program:
mov ax, data
mov ds, ax
CALL writeToFile
mov ax, 4c00h
int 21h
code ends
end start_program
Run Code Online (Sandbox Code Playgroud)
我用TurboDebugger看看会发生什么.奇怪的是,它总是具有AX
价值0005
意义Access Denied
我在互联网上可以找到的所有东西都是ASSEMBLY …
我帮助我的一个朋友调试他的程序,我们把它缩小到一个甚至在这里发生的问题:
.MODEL small
.STACK 16
.CODE
start:
mov ax, 044c0h
mov bl, 85
idiv bl
exit:
mov ax, 4c00h
int 21h
end start
Run Code Online (Sandbox Code Playgroud)
用tasm 4.1组装它,然后在DOSBox 0.74上运行它,它进入一个无限循环.当涡轮调试器检查它人们可以看到它之后发生idiv
的指令,这对于一些原因,修改cs
和ip
登记,并经过两次看似随意指令恢复它们指向idiv
线,再次执行它循环往复.
有没有人对此有任何解释?